关于Linux应用程序中信号函数sigpending使用的一点疑惑
以下程序是APUE第三版中第10章(276页)的一个例程,关于这个例程有两点不理解的地方,我已经用红体字标识在下面,疑问也写在了对应程序段的上面,小弟新学,弄不懂这两个疑问,请大神们帮我解答一下,先谢过了。。
#include "apue.h"
static void sig_quit(int);
int main(void)
{
sigset_t newmask, oldmask, pendmask;
/*第一点疑惑:signal信号的原型:void (*signal(int signo, void (*func)(int) ))(int) ,但下面的signal函数中的sig_quit并没有声明为函数指针 */
if (signal(SIGQUIT, sig_quit) == SIG_ERR)
err_sys("can't catch SIGQUIT");
sigemptyset(&newmask);
sigaddset(&newmask, SIGQUIT);
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) <0)
err_sys("SIG_BLOCK error");
sleep(5);
if (sigpending(&pendmask) < 0)
err_sys("sigpending error");
if (sigismember(&pendmask, SIGQUIT))
printf("\nSIGQUIT pending\n");
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
err_sys("SIG_SETMASK error");
printf("SIGQUIT unblocked\n");
sleep(5);
exit(0);
}
static void sig_quit(int signo)
{
printf("catch SIGQUIT\n");
if (signal(SIGQUIT,SIG_DEL)==SIG_ERR)
err_sys("can't reset SIGQUIT");
}
/* 第二个疑惑:函数sig_quit()中的内容是怎么输出的,并且为什么该函数中的printf语句先执行?*/
编译运行此程序: ./a.out
^\ 产生一次信号
SIGQUIT pending
caught SIGQUIT
SIGQUIT unblocked