关于APUE书上sigsuspend的一些不理解

发布于 2022-09-07 11:34:48 字数 1213 浏览 38 评论 0

代码如下:

include "apue.h"

static void sig_int(int);

int
main(void)
{

sigset_t    newmask, oldmask;

pr_mask("program start: ");

if (signal(SIGINT, sig_int) == SIG_ERR)
    err_sys("signal(SIGINT) error");
sigemptyset(&newmask);
sigaddset(&newmask, SIGINT);

/*
 * Block SIGINT and save current signal mask.
 */
if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
    err_sys("SIG_BLOCK error");

/*
 * Critical region of code.
 */

pr_mask("in critical region: ");

/*
 * Reset signal mask which unblocks SIGINT.
 */
if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
    err_sys("SIG_SETMASK error");

pr_mask("after  SIG_SETMASK: ");


pause();

/*
 * And continue processing ...
 */
pr_mask("program exit: ");

exit(0);

}

static void sig_int(int signo)
{

pr_mask("\nin sig_int: ");

}

书上说:

在信号阻塞时,产生了信号,那么该信号的传递就被推迟直到对它解除了阻塞,对应用程序而言,该信号好像发生在解除对SIGINT的阻塞和pause之间,或者如果在解除阻塞时刻和pause之间确实发生了信号,那么可能不会再见到该信号。

但是我照着上面的代码编译运行,在下面两句之间按ctrl+c,信号一样会捕捉到

pr_mask("after  SIG_SETMASK: ");
pause();

不知道书上说的情况要怎么样才会发生?

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

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

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文