IPC消息队列溢出后果
IPC message queue overflow consequences
我正在创建一个 C 应用程序,它将在 openwrt 路由器设备中执行。由于资源有限,我对消息队列有点害怕。如果从队列中获取消息的“reader”应用程序崩溃并且“编写器”仍在发送消息怎么办?我应该担心设备的内存还是消息队列最终会自行清理?
编辑我意识到我对我的任务不够清楚。一个应用程序将发送消息,另一个将读取和处理消息。
参见the documentation for msgsnd
:
The queue capacity is governed by the msg_qbytes field in the associated data structure for the message queue. During queue creation this field is initialized to MSGMNB bytes, but this limit can be modified using msgctl(2).
If insufficient space is available in the queue, then the default behavior of msgsnd() is to block until space becomes available. If IPC_NOWAIT is specified in msgflg, then the call instead fails with the error EAGAIN.
所以发件人会等待收件人处理消息,除非你使用IPC_NOWAIT
,在这种情况下它returns EAGAIN
并且发件人可以检查这个错误代码.
默认的最大缓冲区大小在名为 MSGMNB 的常量中指定。您可以打印此值以查看它在您的系统上的内容。要更改队列的最大大小,可以使用函数 msgctl
.
我正在创建一个 C 应用程序,它将在 openwrt 路由器设备中执行。由于资源有限,我对消息队列有点害怕。如果从队列中获取消息的“reader”应用程序崩溃并且“编写器”仍在发送消息怎么办?我应该担心设备的内存还是消息队列最终会自行清理?
编辑我意识到我对我的任务不够清楚。一个应用程序将发送消息,另一个将读取和处理消息。
参见the documentation for msgsnd
:
The queue capacity is governed by the msg_qbytes field in the associated data structure for the message queue. During queue creation this field is initialized to MSGMNB bytes, but this limit can be modified using msgctl(2).
If insufficient space is available in the queue, then the default behavior of msgsnd() is to block until space becomes available. If IPC_NOWAIT is specified in msgflg, then the call instead fails with the error EAGAIN.
所以发件人会等待收件人处理消息,除非你使用IPC_NOWAIT
,在这种情况下它returns EAGAIN
并且发件人可以检查这个错误代码.
默认的最大缓冲区大小在名为 MSGMNB 的常量中指定。您可以打印此值以查看它在您的系统上的内容。要更改队列的最大大小,可以使用函数 msgctl
.