为什么必须定义一个处理程序才能让 sigsuspend 返回?

为什么必须定义一个处理程序才能让 sigsuspend 返回?

我正在完成一项学校作业,其中我在两个进程之间发送信号。进程 1 向进程 2 发送信号,然后进程 2 将 SIGUSR1 发送回进程 1 以确认原始信号。

在进程 2 中,我常常sigsuspend等待 SIGUSR1,但是,我注意到如果我从未为 SIGUSR1 设置处理程序,则该函数会无限期阻塞。一旦我配置了虚拟处理程序,sigsuspend 就可以正常工作。

所以我很好奇,如果我只是在继续之前使用信号作为等待机制,为什么我需要定义一个虚拟 nandler?

答案1

因为在 POSIX 标准中sigsuspend简单地定义为仅mask在信号处理程序捕获到未输入的信号时才返回:

sigsuspend() 函数应将调用线程的当前信号掩码替换为 sigmask 指向的信号集,然后挂起线程,直到传递一个信号,该信号的操作是执行信号捕获函数或终止进程。 […]

如果操作是终止进程,则 sigsuspend() 将永远不会返回。如果操作是执行信号捕获函数,则 sigsuspend() 应在信号捕获函数返回后返回,并将信号掩码恢复到 sigsuspend() 调用之前存在的集合。

即使使用sigsuspend正常的信号处理也会处理信号:

  • 被忽略的信号不会正常中断进程,因此不会导致sigsuspend返回。
  • 终止信号终止进程,因此sigsuspend无法返回。
  • 带有处理程序的信号会导致处理程序运行,然后恢复程序执行,因此sigsuspend可以在处理程序完成后返回。

通常(至少在 Linux、FreeBSD 和 Mac OS X 上)SIGUSR1应该终止进程,因此进程 2 应该退出而不是无限期地阻塞。您也许signal(SIGUSR1, SIG_IGN)在某个地方使用过吗?

相关内容