[완료]APUE에서 sigsuspend를 사용한 예제 실행시켜보던중 질문 드립니다.
글쓴이: closeyes / 작성시간: 금, 2007/05/04 - 3:14오후
2판 10장 16절에 보면 다음과 같은 예제(fig10.23)가 있습니다.
전역변수quitflag를 사용해서 특정 시그널에 해당 변수를 플래그로 써서 사용할 때도 sigsuspend()를 사용할 수 있다는 거를 보여주기 위한 함수라고 책에 나와있네요.
/********************************************************************** *NAME * *DESCRIPTION * This program Using sigsuspend to wait for a global variable to be set. **********************************************************************/ #include "common.h" #include "error.h" volatile sig_atomic_t quitflag; /* set nonzero by signal handler */ static void sig_int (int signo) /* one signal handler for SIGINT and SIGQUIT */ { if (signo == SIGINT) printf("\ninterrupt\n"); else if (signo == SIGQUIT) printf("\nSIGQUIT is catched.\n"); quitflag = 1; /* set flag for main loop */ } int main(void) { sigset_t newmask, oldmask, zeromask; if (signal(SIGINT, sig_int) == SIG_ERR) err_sys("signal(SIGINT) error"); if (signal(SIGQUIT, sig_int) == SIG_ERR) err_sys("signal(SIGQUIT) error"); sigemptyset(&zeromask); sigemptyset(&newmask); sigaddset(&newmask, SIGQUIT); /* * Block SIGQUIT and save current signal mask. */ if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) err_sys("SIG_BLOCK error"); while (quitflag == 0) sigsuspend(&zeromask); /* * SIGQUIT has been caught and is now blocked; do whatever. */ quitflag = 0; /* * Reset signal mask which unblocks SIGQUIT. */ if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) err_sys("SIG_SETMASK error"); exit(0); }
책에 나와있는 정상적인 실행화면은 다음과 같습니다.
$ ./a.out ^? type the interrupt character interrupt ^? type the interrupt character again interrupt ^? and again interrupt ^? and again interrupt ^? and again interrupt ^? and again interrupt ^? and again interrupt ^\ $ now terminate with quit character
하지만 제 시스템RHE4 AS에서는 다음과 같이 실행됩니다.
$ ./demo_syspend02 ^? interrupt $
왜 이렇게 나오는지 짐작이 안되서 이렇게 질문 드립니다.
gcc버전은 gcc version 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)
최적화는 하지 않았습니다.
Forums:
혹 sig_int() 함수 안에
혹 sig_int() 함수 안에 중괄호 한 쌍이 빠져있는 건 아닐까요? 고전적인 상황이죠 :-)
오호! 시그널 기다릴 때 pause() 함수를 즐겨 썼는데, sigsuspend()라는 근사한 이름의 함수가 있었군요.
----
$PWD `date`
$PWD `date`
허걱 이런 실수를 ..
말씀하신 대로 중괄호가 빠져있네요.
정말 감사합니다.
댓글 달기