[완료]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`
허걱 이런 실수를 ..
말씀하신 대로 중괄호가 빠져있네요.
정말 감사합니다.
댓글 달기