gpt4 book ai didi

c++ - 如何处理不同大小的 Linux 消息队列(POSIX 或 SysV)中的信号?

转载 作者:太空宇宙 更新时间:2023-11-04 10:59:31 27 4
gpt4 key购买 nike

处理具有不同大小信号的 Linux 消息队列(POSIX 或 SysV)信号的最佳方法是什么?

假设我有一个进程可以接收两个或多个不同大小的不同信号。例如:

struct sig1 {
long mType;
char data[10];
};

struct sig2 {
long mType;
char data[20000];
};

现在,据我了解消息队列 API,为了接收这些信号,我需要确保我可以为数据提供一个缓冲区,该缓冲区至少等于消息队列中传递的最大消息的大小.

int msgrcv(int msqid, void *msgp, size_t msgsz,
long msgtyp, int msgflg);

对我来说,我需要为接收到的每个信号分配一个新缓冲区似乎是不切实际的,该缓冲区与队列中传递的最大消息一样大。或者有没有办法在从队列中取出消息之前轮询队列以了解消息有多大?现在,在我上面提供的极端情况下,我需要为接收到的每个信号分配 20000 个字节,即使在接收到 sig1 时,仅 10 个字节就足够了。

假设我有一个具有高信号负载和大小差异很大的信号的应用程序。有没有好的方法来处理这种情况?另外,从性能的角度来看,我是否会因为每次接收都需要分配更大的缓冲区而失去性能?

最佳答案

抱歉,完全重写,我将 msgrcv 与从管道和套接字中读取混淆了,其中每个数据包都可以部分或整体读取。

您需要有一个足够大的接收缓冲区,以容纳您可能接收到的所有消息中的最大消息。

实际大小作为 msgrcv 的返回值返回,所以像这样:

 struct sig2 msg;
size_t n = msgrcv(queue_id, &msg, sizeof(msg.data), -1, 0);
if (n == -1)
{
... error - inspect errno to understand what went wrong ...
}

另请注意,默认大小为 16384 字节,因此 20000 字节的数组可能无法工作,除非您重新配置默认消息大小。

关于c++ - 如何处理不同大小的 Linux 消息队列(POSIX 或 SysV)中的信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27515204/

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