2009-12-05 166 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更爲直觀和不那麼古怪。