System Call 수행 중의 시그널처리
시스템콜 (read) 수행중의 시그널처리
#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);
}
}
//act.sa_flags=SA_RESTART;
(SA_RESTART: 시그널 핸들러에 의해 중지된 시스템 호출을 자동적으로 재시작한다.)
act.sa_flags=0; read라는 함수를 실행하지 않고 끝냄, if부분출력
act.sa_flags=SA_RESTART; read라는 함수로 다시 돌아감, else부분 출력
//SA_RESTART로 인한 read의 수행으로
(헷갈리지 않기! ctrl-c말고 문자를 쳤기때문에가 아님. 0대신 SA_RESTART를 썼기 때문임)
키보드로 부터 무언가 읽었기에 n이 0보다 크다.(전 코드는 읽지못해 -1)
그 덕에 else의 문장을 수행할 수 있다.
->catch_sigint에서 시그널 핸들러를 수행한 후 read로 되돌아왔다, read가 실행됐다.
//내생각엔, ctrl-c가 바이트(문자세는단위..!)로 다룰수 있는게 아니다. 시그널 핸들러 후 if else문 출력 하지 않는 이유는? if문에 해당되지 않으며, 글자가 아닌 ctrl-c라 n으로 셀 수 없는것이기에 else도 해당이 없다.
글자를 넣으면 read 작동하고 바이트측정해 n으로 뜸
그리고 ifelse문까지 안가서 안뜬것으로 보임. 그래서 for문도 안돌고 카운트도 안올라감.