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上测试却没有碰到问题。
...全文
594 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧