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이 자동적으로 시스템에 저장된다.

 

 

결과값