【问题标题】:Difference between mq_send and msgsndmq_send 和 msgsnd 的区别
【发布时间】:2014-12-16 07:14:15
【问题描述】:

我正在尝试使用pthreads 在 C 中实现一个多线程程序,并希望在线程之间发送消息。

在网上阅读时,我遇到了两种方法。

一个是posix队列,它使用mq_receivemq_send等函数和另一个方法msgrcvmsgsnd

我还注意到在 mq_send 中,我们只能发送字符串,不能发送自定义的数据结构。有没有办法使用 mq_send 或替代函数发送不同的数据结构?

哪种方法最好用?什么情况下最好使用这些功能?

【问题讨论】:

  • 如果您对这些感兴趣,我建议您尝试使用 Unix Domain Sockets。我发现 UDS 在 Linux 上运行得更好,并且还具有使用更类似于 TCP 和 UDP 的常用套接字 API 的优势。

标签: c pthreads message-queue


【解决方案1】:

POSIX: mq_sendmq_receive 是 POSIX。 POSIX 消息队列与 System V 现代、简单和轻量级相比。它具有简单的 I/O 功能,您只能发送和接收字节。在 POSIX 中,您可以优先发送数据。读取功能很简单,只能读取下一条数据。在这种情况下,System V 可以做得更多。

但是,您也可以使用 POSIX 消息队列发送复杂的结构。你必须使用工会。

struct mydata {
    int i;
    long x;
    // whatever you want
};

union myunion {
    struct mydata;
    char bytes[sizeof(mydata)];
};

现在您只需以这种方式发送数据:

myunion u;
u.mydata = // struct to send
mq_send(... &u.bytes .....); // access byte sequence of struct

系统五: System V 消息队列要复杂得多。 Can 可以发送复杂的结构并按优先级发送。接收器可以配置为只接收具有一个选定优先级的消息或按优先级排序的所有消息。它有更多的功能。

我更喜欢 POSIX,因为它简单易用。使用 POSIX,您还可以使用 mq_notify 注册通知。如果消息可用并且您不需要进行轮询,您会收到一个事件。在 System V 中,您不能这样做。

【讨论】:

    【解决方案2】:

    来自http://linux.die.net/man/7/mq_overview

    System V 消息队列(msgget(2)、msgsnd(2)、msgrcv(2) 等)是用于在进程之间交换消息的旧 API。 POSIX 消息队列提供了比 System V 消息队列更好的设计接口;另一方面,POSIX 消息队列不如 System V 消息队列广泛可用(尤其是在旧系统上)。 Linux 当前 (2.6.26) 不支持对 POSIX 消息队列使用访问控制列表 (ACL)。

    所以这取决于您对旧系统的可移植性的重视程度,我猜?

    【讨论】:

    • 如何使用 mq_send 传递自定义数据结构?我觉得不可能
    • 这是可能的,前提是您使用强制转换并正确设置msg_len 参数。如果你需要传递不同的自定义结构,你可以考虑一个 header/payload 结构。
    猜你喜欢
    • 2010-12-23
    • 1970-01-01
    • 2010-12-11
    • 2016-08-17
    • 2012-10-27
    • 2014-05-27
    • 2017-02-24
    • 2011-02-21
    • 2010-11-12
    相关资源
    最近更新 更多