APUE 第三版 Figure 15.33
bmxk 2018-09-01 01:28:39 这个例子在 Ubuntu上并不能工作。
使用gdb 调试:
Program received signal SIGUSR2, User defined signal 2.
但是修改fig10.24的代码就可以解决这个问题
将
void
TELL_WAIT(void)
{
if (signal(SIGUSR1, sig_usr) == SIG_ERR)
err_sys("signal(SIGUSR1) error");
if (signal(SIGUSR2, sig_usr) == SIG_ERR)
err_sys("signal(SIGUSR2) error");
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGUSR2);
/* Block SIGUSR1 and SIGUSR2, and save current signal mask */
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
err_sys("SIG_BLOCK error");
}
修改为
void
TELL_WAIT(void)
{
struct sigaction act;
act.sa_handler = sig_usr;
act.sa_flags = SA_NODEFER;
act.sa_sigaction = sig_usr;
sigemptyset(&act.sa_mask);
if (sigaction(SIGUSR1, &act, NULL) == -1)
err_sys("signal(SIGUSR1) error");
if (sigaction(SIGUSR2, &act,NULL) == -1)
err_sys("signal(SIGUSR2) error");
sigemptyset(&zeromask);
sigemptyset(&newmask);
sigaddset(&newmask, SIGUSR1);
sigaddset(&newmask, SIGUSR2);
/* Block SIGUSR1 and SIGUSR2, and save current signal mask */
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
err_sys("SIG_BLOCK error");
}
望大神可解答原因,另外在Mac上测试却没有碰到问题。