2009-12-05 30 views
2

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

回答

4

mq_*函数是POSIX函数。 msg*功能来自通常称为“System V IPC”的功能(因为它们是UNIX System V引入的包括共享内存和信号量的IPC设备的一部分)。我认为可以这样说,msg*函数包含在POSIX和X/Open标准中,这是因为向后兼容性比其他方法更合适;这可能会使他们变得不公正,但通常标准试图避免多种方式来达到相同的结果。他们在原始版本的POSIX中都没有。

你需要考虑你将移植你的代码的位置。我会建议使用更现代的mq_*函数,如果它们在任何需要的地方都可用的话 - 尽管我自己并没有使用它们。一般来说,msg*函数比共享内存和信号量函数使用得少,但该接口比POSIX接口长(约十年或更长),所以它可能更广泛地可用。

+0

哇,所以msg *函数不是POSIX?我的书叫他们“POSIX:XSI”消息队列... – Steven 2009-12-05 02:51:50

+0

我认为这就是所谓的重新品牌。 ;) – Duck 2009-12-05 03:06:23

+1

它们在POSIX中 - 它们不是由POSIX产生的(事实上它们是在POSIX之前的)。你的书是正确的,可以给他们贴上POSIX:XSI的标签。 – 2009-12-05 03:35:35

1

一般来说,您应该尽量使用POSIX版本,因为它们应该更适合更广泛的平台。

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

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

相关问题