- 论坛徽章:
- 0
|
读APUE(第二版),其中关于信号的一个例程:
#include <signal.h>
#include "apue.h"
volatile sig_atomic_t quitflag; /* set nonzero by signal handler */
int
main(void)
{
void sig_int(int);
sigset_t newmask, oldmask, zeromask;
quitflag =0;
printf("quitflag=%d",quitflag);
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);
}
void
sig_int(int signo) /* one signal handler for SIGINT and SIGQUIT */
{
if (signo == SIGINT)
printf("\ninterrupt\n");
else if (signo == SIGQUIT)
{
printf("\nquit\n");
quitflag = 1; /* set flag for main loop */
}
return;
}
问题1,volatile sig_atomic_t quitflag,这个变量初始化的时候,就是0值么??
问题2,我在linux下编译运行,然后运行期间送出一个“ctrl+\”(quit)信号,但是要求打印的printf("quitflag=%d",quitflag)语句为什么在我发送出quit信号之后才打印呢??按道理来说,应该是最先打印的。
帮忙看看。 |
|