min's devlog
System Call 수행 중 함수 처리 본문
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