暂停()信号处理程序
pause() signal handler
pause()
函数阻塞,直到信号到达。
假设进程收到信号并返回 pause(),信号处理程序是否会在 之前 执行 pause()
调用之后的代码,或者结果是意外的?
示例:
void sigusr1_handler()
{
// .. handler code
}
void main()
{
// .. bind handler to SIGUSR1
pause(); // wait for SIGUSR1
// some more code
}
"some more code" 是否总是在 sigusr1_handler()
完成后执行,或者存在竞争条件?如果是,解决方案是什么?
除了忙等我什么也想不出来,不过这样就根本不需要暂停了..
pause() returns only when a signal was caught and the signal-catching function returned. In this case, pause() returns -1, and errno is set to EINTR.
您可以确定您的信号处理程序在 some more code
之前运行。
信号处理程序不会运行并发;它们中断处理它们的线程,中断的流程仅在信号处理程序 returns.
时继续
但是,您的示例可能还有其他竞争条件;只有稀疏的伪代码而不是对您的用例的完整解释,很难说。例如,一个不同的信号可能会在您的信号出现之前到达并中断 pause
,然后您的处理程序可能会比您预期的晚 运行 结束。
有几个 "right ways" 可以代替:
write
一个字节到信号处理程序中的 pipe
,并在主要执行流程中从它 read
。
sem_post
来自信号处理程序的信号量,sem_wait
在主要执行流程中。
- 使用
sigwaitinfo
或 sigtimedwait
而不是信号处理程序。
仍然使用pause
,但在一个循环中:
while(!signal_handler_finished) pause();
其中 signal_handler_finished
的类型为 volatile sig_atomic_t
,并在信号处理程序中设置为非零值。
pause()
函数阻塞,直到信号到达。
假设进程收到信号并返回 pause(),信号处理程序是否会在 之前 执行 pause()
调用之后的代码,或者结果是意外的?
示例:
void sigusr1_handler()
{
// .. handler code
}
void main()
{
// .. bind handler to SIGUSR1
pause(); // wait for SIGUSR1
// some more code
}
"some more code" 是否总是在 sigusr1_handler()
完成后执行,或者存在竞争条件?如果是,解决方案是什么?
除了忙等我什么也想不出来,不过这样就根本不需要暂停了..
pause() returns only when a signal was caught and the signal-catching function returned. In this case, pause() returns -1, and errno is set to EINTR.
您可以确定您的信号处理程序在 some more code
之前运行。
信号处理程序不会运行并发;它们中断处理它们的线程,中断的流程仅在信号处理程序 returns.
时继续但是,您的示例可能还有其他竞争条件;只有稀疏的伪代码而不是对您的用例的完整解释,很难说。例如,一个不同的信号可能会在您的信号出现之前到达并中断 pause
,然后您的处理程序可能会比您预期的晚 运行 结束。
有几个 "right ways" 可以代替:
write
一个字节到信号处理程序中的pipe
,并在主要执行流程中从它read
。sem_post
来自信号处理程序的信号量,sem_wait
在主要执行流程中。- 使用
sigwaitinfo
或sigtimedwait
而不是信号处理程序。 仍然使用
pause
,但在一个循环中:while(!signal_handler_finished) pause();
其中
signal_handler_finished
的类型为volatile sig_atomic_t
,并在信号处理程序中设置为非零值。