【问题标题】:Should I use msgsnd or mq_send?我应该使用 msgsnd 还是 mq_send?
【发布时间】:2010-12-23 11:36:42
【问题描述】:

我正在学习 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 描述了两者之间的一些差异,但我不确定其中有多少是特定于实现的。是否有任何令人信服的理由使用一个家庭而不是另一个家庭?哪一个比另一个“更好”?

【问题讨论】:

    标签: c unix ipc posix


    【解决方案1】:

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

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

    【讨论】:

    • 哇,所以 msg* 函数不是 POSIX?我的书称它们为“POSIX:XSI”消息队列......
    • 我认为这就是品牌重塑。 ;)
    • 它们在 POSIX 中——它们并非起源于 POSIX(事实上,它们早于 POSIX)。你的书正确地将它们标记为 POSIX:XSI。
    【解决方案2】:

    一般情况下,您应该尽可能使用 POSIX 版本,因为它们应该更易于移植到更广泛的平台。

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

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

    【讨论】:

      猜你喜欢
      • 2014-12-16
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 2015-10-16
      • 2023-03-06
      • 2013-02-20
      • 2011-07-31
      • 2015-05-22
      相关资源
      最近更新 更多