Linux/TCP IP Socket Programming

System Call 수행 중의 시그널처리

값진 2021. 4. 9. 02:59

시스템콜 (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문도 안돌고 카운트도 안올라감.