我正在完成一项学校作业,其中我在两个进程之间发送信号。进程 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)
在某个地方使用过吗?