我应该使用msgsnd还是mq_send?

时间:2009-12-05 02:37:31

标签: c unix ipc posix

我正在学习Unix IPC,而我的书只讨论了msg *系列函数。然而,在浏览手册页时,我了解了mq_等价物。 http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi/0650/bks/SGI_Developer/books/T_IRIX_Prog/sgi_html/ch06.html描述了两者之间的一些差异,但我不确定其中有多少是特定于实现的。是否有任何令人信服的理由使用一个家庭而不是另一个家庭?是一个“比另一个”更好吗?

2 个答案:

答案 0 :(得分:4)

mq_*函数是POSIX函数。 msg*函数来自通常所说的'System V IPC'(因为它们是UNIX System V引入的IPC工具的一部分,包括共享内存和信号量)。我认为可以公平地说msg*函数更多地包含在POSIX和X / Open标准中,因为它们具有向后兼容性,而不是其他需要的;这可能对他们造成了不公正,但通常标准试图避免多种方式来实现相同的结果。它们都不是原始版本的POSIX中的。

您需要考虑将代码移植到何处。我建议使用更现代的mq_*函数,如果它们可以在任何你需要的地方使用 - 虽然我自己没有使用它们。一般来说,msg*函数的使用频率低于共享内存和信号量函数,但该接口比POSIX函数长了(十年或更长),因此可能会更广泛地使用。

答案 1 :(得分:1)

一般情况下,您应尽量使用POSIX版本,因为它们应该可以更方便地使用更广泛的平台。

主要区别在于POSIX队列可以在将消息放入空队列时生成信号或生成新线程。 POSIX队列也总是返回最高优先级的最旧消息; SysV队列可以返回您指定的任何优先级的消息。

每个人的里程都会有所不同,但我发现POSIX界面比SYSV或SysV IPC更直观,更不古怪。