mq_send和msgsnd之间的区别

时间:2014-10-21 06:33:19

标签: c pthreads message-queue

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

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

一个是posix队列,它使用mq_receivemq_send和另一种方法msgrcvmsgsnd等功能。

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:1)

来自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)。

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