Linux/TCP IP Socket Programming
System Call 수행 중 함수 처리
값진
2021. 4. 9. 16:09
select()
동시에 여러개의 프로세스를 처리하는 함수
select()는 SA_RESTART 에 의해 재시작되지 않는 예외적인 함수이다
따라서, SA_RESTART 플랙을 설정해도, select()함수가 시그널에 의해 인터럽트 되었는가를 검사하는게 안전하다.
SA_NODEFER 옵션
act.sa_flags = SA_RESTART | SA_NODEFER
중복도착한 시그널의 수 만큼 시그널 핸들러를 처리한다.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>
#include<signal.h>
//시그널 핸들러
void catch_sigint(int signum){
int count;
printf("\n(count=%d) CTRL-C pressed!\n",count);
return;
}
int main(int argc,char*argv[]){
struct sigaction act; //sigaction 구조체
sigset_t masksets;
int i;
int count;
char buf[10];
sigfillset(&masksets);
//시그널 핸들러 설치
act.sa_handler=catch_sigint;
//시그널 핸들러가 실행되는 동안 모든 시그널을 블록함
act.sa_mask=masksets;
//act.sa_flags=0; //수정
act.sa_flags=SA_RESTART;
sigaction(SIGINT,&act,NULL);
for(count=0; count<3; count++){
int n = read(0,buf,sizeof(buf)); //키보드로 읽어서(0) 받는게(buf) n으로 뜬다. 여탠 n에 안뜸.
if(n==-1&&errno==EINTR)
printf("read함수 interrupted\n");
else
printf("\t**%d byte input\n",n);
}
}