apue书中一个关于sigsuspend函数的例子

发布于 2022-09-30 19:50:02 字数 2093 浏览 12 评论 0

看到有关signal一章,然后有一个程序在我电脑上执行的情况和书上描述的不同。代码如下

  1. #include "apue.h"
  2. volatile sig_atomic_t quitflag;
  3. static void sig_int(int signo)
  4. {
  5.         if(signo == SIGINT)
  6.           printf("\ninterrupt\n");
  7.         else if(signo == SIGQUIT)
  8.           quitflag = 1;
  9. }
  10. int main(void)
  11. {
  12.         sigset_t zeromask, newmask, oldmask;
  13.         if(signal(SIGINT, sig_int) == SIG_ERR)
  14.           err_sys("signal(SIGINT) error");
  15.         if(signal(SIGQUIT, sig_int) == SIG_ERR)
  16.           err_sys("signal(SIGQUIT) error");
  17.         sigemptyset(&zeromask);
  18.         sigemptyset(&newmask);
  19.         sigaddset(&newmask, SIGQUIT);
  20.         if(sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
  21.           err_sys("SIG_BLOCK error");
  22.         while(quitflag == 0)
  23.           sigsuspend(&zeromask);
  24.         quitflag = 0;
  25.         if(sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
  26.           err_sys("SIG_SETMASK error");
  27.         exit(0);
  28. }

复制代码按书上的结果, 应该是按CTRL+C就会输出字符串“interrupt”,按多次也是同样的结果, 按下CTRL+\就会退出程序。  我实际执行的时候按第一下CTRL+C会输出“interrupt”,按第二下CTRL+C就会直接退出程序,按下CTRL+\也会退出程序。  因此就是按下CTRL+C的情况和书上的不符,想知道原因。 多谢!
我这系统是UBUNTU 10.10, linux 2.6.35

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

但可醉心 2022-10-07 19:50:02

同问。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文