min's devlog

System Call 수행 중 함수 처리 본문

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); 
} 


}

'Linux > TCP IP Socket Programming' 카테고리의 다른 글

SIGCHLD, wait()  (0) 2021.04.09
alarm() 인터럽트  (0) 2021.04.09
System Call 수행 중의 시그널처리  (0) 2021.04.09
Read 수행 중의 시그널처리  (0) 2021.04.08
Signal handler 코드  (0) 2021.04.04
Comments