我最近一直在调查和使用 linux 消息队列,并且遇到了一些我不太明白为什么会发生的事情!
如果我们有两个正在运行的程序都在无限循环中使用 msgrcv() 来检查消息然后发送两条消息,那么第一个运行的程序将接收第一条消息,而第二个程序将接收第二条消息?如果您继续发送消息,则它会在每个接收者之间交替。
显然,我知道一旦一个程序读取了消息,它就会从队列中删除,但是如果它们都在无限检查,谁/如何决定谁将接收消息?
任何帮助,将不胜感激!
我最近一直在调查和使用 linux 消息队列,并且遇到了一些我不太明白为什么会发生的事情!
如果我们有两个正在运行的程序都在无限循环中使用 msgrcv() 来检查消息然后发送两条消息,那么第一个运行的程序将接收第一条消息,而第二个程序将接收第二条消息?如果您继续发送消息,则它会在每个接收者之间交替。
显然,我知道一旦一个程序读取了消息,它就会从队列中删除,但是如果它们都在无限检查,谁/如何决定谁将接收消息?
任何帮助,将不胜感激!
简短的回答是内核决定。
长答案是,这是由Linux 内核中的do_msgrcv()
调用处理的。如果没有可用的消息,则调用者将被放入队列中,直到有消息可用。不能保证像你描述的那样来回走动,因为这完全取决于每次msgrcv()
调用的时间,但在你的情况下,它可能几乎一直都是这样。