Linux/TCP IP Socket Programming
Read 수행 중의 시그널처리
값진
2021. 4. 8. 22:45
read 수행중의 시그널처리
시그널 핸들러
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;
sigaction(SIGINT,&act,NULL);
//수정
/*for(count=0; count<3; count++){
read(0,buf,sizeof(buf));
return 0; */
for(count=0; count<3; count++){
int n = read(0,buf,sizeof(buf)); //변수 선언을 미리해야하는 경우도 많다.
if(n==-1&&errno==EINTR)
printf("read함수 interrupted\n");
else
printf("\t**%d byte input\n",n);
}
}
// int n = read(0,buf,sizeof(buf)); 에서 변수 선언을 미리해야하는 경우도 많다.
n은 read의 결과값. 입력받은게 몇 byte인가?
if(n==-1&&errno==EINTR)
//n이 -1 : 읽은 byte수 없음. 근데 뭔가 이벤트는 발생함. errno=EINTR : interrupt가 걸렸다(interrupt error)
//else n이 -1이 아니라면 : 뭐든지 읽었다(read수행). 결과를 보니 읽은 것 없이 return함.
//read에서 어떤 일이 일어나면 buf에 저장되는데, ctrl-c가 일어났음에도 저장되지 않았다.
//ctrl-c가 발생했으니 read의 결과값 n이 있어야하는데, 예상과 다르게 없다.
//ctrl-c가 아닌 act.sa_flags가 0이기에 read가 실행이 안되었고 n이 -1 된것
//따라서, 시스템콜(read) 수행시 interrupt 가 걸리면 그 interrupt에 관련된 signal handler를 수행하고 return하는데 return결과값 n은 ctrl-c가 인식하는게 아니다. 그때의 결과값이 n은 -1, errno은 EINTR이 자동적으로 시스템에 저장된다.