2009-10-29 38 views
4

任何人都可以告诉我,如果多线程程序在执行mq_send期间接收到SIGSTOP信号会发生什么情况?是mq_send原子?

+0

所以,我已经在我的Linux机器上做了一些测试(Linux home 2.6.31-11-generic#38 -Ubuntu SMP Fri Oct 10 2 11:06:40 UTC 2009 x86_64 GNU/Linux),它似乎是原子,但我不是100%肯定的。如果有人知道确切的答案或知道如何mq_send的作品,这将是很高兴与我们分享信息:) – iddqd 2009-10-29 20:18:46

回答

2

mq_send的手册页表明它在mq_timedsend之上实现,这是在Linux中的一个系统调用。系统调用通常是原子性的,因为它们要么成功,要么不成功。如果系统调用被信号中断,通常的行为是返回-1并将errno设置为EINTR。它看起来像mq_send有这种行为。

基本上,您应该检查EINTR,如果以这种方式失败,请重试呼叫。这对于可能阻止的系统调用尤为重要,如recvselect,因为它们被中断的可能性较高。