gpt4 book ai didi

linux - 使用 POSIX 消息队列进行进程内通信

转载 作者:行者123 更新时间:2023-12-01 11:04:36 26 4
gpt4 key购买 nike

我正在设计一个单进程多线程嵌入式 Linux 应用程序。该设计包括客户端-服务器子系统,其中工作线程接收其他线程在 POSIX 消息队列上发布的消息。

我需要队列展示非阻塞发送和阻塞接收语义。我可以想到几种方法来实现上述目标:- 创建两个单独的消息队列描述,以便为发送和访问队列 接收,即调用 mq_open 两次。接下来将设置 O_NONBLOCK 标志 将用于通过队列发送的描述。

  • 指定阻塞行为并使用 mq_timedsend 代替 mq_send

  • 指定阻塞行为并在 mq_send 之前调用 mq_getattr 以避免在发送时阻塞

第一个解决方案可能是首选的解决方案,但是要使其工作,必须保证每次调用 mq_open 都会创建一个新的消息队列描述对象(我还假设进程中的线程可以使用多个这样的对象来执行在同一个队列上操作)。

POSIX 似乎提供了这样的保证(https://pubs.opengroup.org/onlinepubs/009695399/functions/mq_open.html),但是 Linux 文档没有明确说明每次调用 mq_open 都会创建一个新的消息队列描述对象。

Linux有这样的保证吗?

谢谢,

最佳答案

I need the queue to exhibit non-blocking send and blocking receive semantics.

您可以使用 mq_timedsend在具有过期超时(例如 abs_timeout{0, 0})的阻塞队列上,这使得调用在队列已满时立即返回(不阻塞)。


I am designing a single-process multi-threaded embedded Linux application. The design includes client-server subsystem where a worker thread receives messages posted by other threads on a POSIX message queue.

消息队列将数据复制到内核中并返回。不需要在同一进程中的线程之间进行通信。您可以只使用带有互斥锁和条件变量的队列,这类似于内核在您使用消息队列时为您所做的,但是使用您自己的队列可以避免将数据复制到内核中并返回。

I need the queue to exhibit non-blocking send and blocking receive semantics.

非阻塞mq_send只是指队列满了不阻塞。

The kernel protects the message queue with a spinlock internally自旋锁锁定在 mq_sendmq_receive 上,因此从并发数据结构的角度来看,POSIX 消息队列是一个阻塞数据结构。

关于linux - 使用 POSIX 消息队列进行进程内通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60438892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com