请考虑以下代码:
过程A(随机时间点):
void catch(){}; // empty handler.
signal(SIGCHLD,&catch); // attach empty handler.
doSomthing();
unlock_semaphore(0);
pause();
进程B(目前使用信号量0阻止)
lock_semaphore(0) // Stuck here until process A unlock 0.
doSomthing();
kill(Process A, SIGCHLD);
考虑这一系列事件:
(0)A:doSomthing
(1)A:unlock
<--------------- Content Switch from A to B.
(2)B:lock
(3)B:doSomthing
(4)B:kill
<--------------- The signal is handled here (Doing nothing).
(5)A:pause()
<--------------- Process A being suspended indefinitely.
所以, 可能发生以下事件序列,从而错过了信号吗?
答案 0 :(得分:2)
是的,这可能发生。而不是使用pause
使用sigsuspend原子地解锁信号,等待暂停等信号,然后再次阻止它。 (这假设你已经阻止了信号,因为否则这种情况可能发生在序列中的任何一点。)