可以在暂停()之前切换上下文导致信号丢失吗?

时间:2014-01-11 19:56:07

标签: linux signals posix semaphore

请考虑以下代码:

过程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.

所以, 可能发生以下事件序列,从而错过了信号吗?

1 个答案:

答案 0 :(得分:2)

是的,这可能发生。而不是使用pause使用sigsuspend原子地解锁信号,等待暂停等信号,然后再次阻止它。 (这假设你已经阻止了信号,因为否则这种情况可能发生在序列中的任何一点。)