進(jìn)程間的通信

閱讀The Complete Friday Q&A:Volume I 第2天
進(jìn)程間通信(Interprocess Communication)

IPC是一個(gè)有趣的,有時(shí)是復(fù)雜的話題,尤其是在OS X上,它擁有真正的IPC技術(shù)庫(kù)。很難決定要使用哪個(gè),有時(shí)甚至很難知道可用的東西.

OS X是Mach與UNIX混合產(chǎn)物,因此您最終會(huì)同時(shí)使用兩種IPC機(jī)制:

1、Mach端口:Mach中的基本IPC機(jī)制??焖?,輕巧,功能強(qiáng)大且難以使用。Mach端口不僅使您可以與其他進(jìn)程進(jìn)行對(duì)話,而且還可以將代碼強(qiáng)行注入其他人的程序中。Mach文檔的糟糕狀態(tài)使其難以上手,并且容易出錯(cuò)。另一方面,核心mach_msg函數(shù)可能是系統(tǒng)中最優(yōu)化的syscall,因此它們的使用速度非???,如果您決定一次分配一百萬(wàn)個(gè)mach的端口,您的機(jī)器幾乎眨眼就能完成。

  • CFMachPort:Mach端口的簡(jiǎn)單封裝。CFMachPort本質(zhì)上是作為runloop的源而存在。它還可以幫助創(chuàng)建和銷(xiāo)毀端口。它只有在接收消息方面有一點(diǎn)作用,而在發(fā)送消息方面沒(méi)有任何作用。
  • CFMessagePort:這個(gè)很好的CoreFoundation包裝器包含一些馬赫功能,可以輕松地在兩個(gè)不相關(guān)的進(jìn)程之間建立同步的來(lái)回通信。您僅需幾行代碼即可啟動(dòng)服務(wù)器。然后,另一個(gè)程序可以通過(guò)名稱(chēng)查找該服務(wù)器并向其發(fā)送消息。您將獲得馬赫數(shù)的速度優(yōu)勢(shì),而無(wú)需在下面進(jìn)行所有雜亂的工作。
  • NSPort / NSMachPort / NSMessagePort:Cocoa也有一些Mach端口的封裝。它們主要是為與分布式對(duì)象一起使用而設(shè)計(jì)的(在下文中有更多介紹),但是如果您勇敢的話,也可以單獨(dú)使用它們。

2、POSIX文件描述符:實(shí)際上有幾種,但是一旦設(shè)置,它們就可以與典型的讀寫(xiě)調(diào)用一起使用。

  • 管道:原型POSIX IPC機(jī)制。如果您曾經(jīng)使用過(guò)|在UNIX Shell中使用管道運(yùn)算符,您已經(jīng)使用了管道。管道是在同一流程中成對(duì)創(chuàng)建的,因此它們對(duì)于在父級(jí)和子級(jí)之間(或在一個(gè)單獨(dú)的,協(xié)調(diào)的父級(jí)的兩個(gè)子級(jí)之間)進(jìn)行通信非常有用,但對(duì)于在不相關(guān)的進(jìn)程之間進(jìn)行通信則不太好。打電話給他們。
  • FIFO:就像文件一樣,但是就像管道! FIFO就像文件一樣在您的文件系統(tǒng)中獲得一個(gè)條目,但是寫(xiě)操作不會(huì)進(jìn)入文件系統(tǒng),而是會(huì)進(jìn)入打開(kāi)fifo進(jìn)行讀取的任何過(guò)程。您可以通過(guò)mkfifo調(diào)用進(jìn)行制作。最終結(jié)果是一個(gè)具有文件系統(tǒng)條目的管道,這可以使兩個(gè)不相關(guān)的進(jìn)程很容易進(jìn)行連接。這些過(guò)程甚至不必知道自己正在與Fifo交談。在您的外殼中嘗試一下:
  • Sockets:您可能通過(guò)使用TCP / IP知道了這些信息,但是它們也可以用于本地通信,而不僅僅是連接到本地主機(jī)。如果在AF_UNIX系列中創(chuàng)建套接字,則將獲得僅用于本地通信的套接字,并且使用比TCP / IP允許的更為靈活的尋址方式。通過(guò)使用套接字和綁定調(diào)用,可以使用類(lèi)似于FIFO的文件系統(tǒng)路徑來(lái)創(chuàng)建AF_UNIX套接字,但是允許多個(gè)客戶(hù)端以及更多通信方式選擇。也可以使用socketpair調(diào)用匿名創(chuàng)建它們,從而為您提供類(lèi)似于管道的東西,但雙向除外。

3、共享內(nèi)存:共享內(nèi)存是一種神奇的內(nèi)存,可以一次出現(xiàn)在多個(gè)進(jìn)程中。換句話說(shuō),您從過(guò)程A中寫(xiě)入數(shù)據(jù),并在過(guò)程B中對(duì)其進(jìn)行讀取,反之亦然。這往往非常快,因?yàn)閿?shù)據(jù)本身從不接觸內(nèi)核,也不必復(fù)制。缺點(diǎn)是協(xié)調(diào)共享內(nèi)存區(qū)域的更改確實(shí)很困難。本質(zhì)上,您可以將線程編程的所有缺點(diǎn)以及將多進(jìn)程編程的大多數(shù)缺點(diǎn)捆綁在一個(gè)簡(jiǎn)單的程序包中??梢允褂胢ach或POSIX API創(chuàng)建共享內(nèi)存。

4、Miscellaneous,而不是真正的IPC:有些技術(shù)并沒(méi)有真正算作“ IPC”,但如果需要,可以用于在程序之間進(jìn)行通信。

  • ptrace:此系統(tǒng)調(diào)用主要用于編寫(xiě)調(diào)試器,但從理論上講,它也可以用于執(zhí)行非調(diào)試器。不推薦,僅出于完整性考慮。
  • Files:有時(shí)使用純舊文件進(jìn)行通信可能會(huì)很有用。這可以很簡(jiǎn)單,例如創(chuàng)建一個(gè)互斥的鎖定文件(一個(gè)簡(jiǎn)單的空文件,只需在該文件中即可工作),或者可以通過(guò)將實(shí)際數(shù)據(jù)寫(xiě)到一個(gè)文件中,然后讓另一個(gè)程序讀取它來(lái)傳輸實(shí)際數(shù)據(jù)。由于您實(shí)際上是在寫(xiě)文件系統(tǒng),所以這往往效率很低,但是它也很容易并且?guī)缀跏峭ㄓ玫摹C總€(gè)應(yīng)用程序都可以讀取文件!

這些就是我所說(shuō)的系統(tǒng)級(jí)功能,它們要么是內(nèi)核/ libSystem直接提供的,要么是它們周?chē)谋“b。 OS X在框架級(jí)別還提供了一堆更高級(jí)別的IPC機(jī)制:

4、Apple Events:天空之災(zāi),丑陋比賽的冠軍,慢王,恐怖帝王。 Apple Events就是所有這些東西,但是它們也非常有用。它們是Mac OS X上用于遠(yuǎn)程控制的GUI應(yīng)用程序普遍支持的唯一IPC機(jī)制。是否要告訴另一個(gè)應(yīng)用程序打開(kāi)文件?蘋(píng)果活動(dòng)的時(shí)間。是否要告訴另一個(gè)應(yīng)用程序正常退出? Apple活動(dòng)時(shí)間。最重要的是,Apple Events是基于mach端口構(gòu)建的,但是API中并未對(duì)此進(jìn)行公開(kāi)。

  • AppleScript:Apple Events的所有情況都在變壞,但仍然經(jīng)常有用,AppleScript是一種基于Apple Events的腳本語(yǔ)言。通常,最好避免直接使用AppleScript,而是直接或通過(guò)諸如Scripting Bridge之類(lèi)的機(jī)制發(fā)送相應(yīng)的原始Apple Events。 AppleScript支持是允許用戶(hù)編寫(xiě)您的應(yīng)用程序腳本的標(biāo)準(zhǔn)方法,盡管如果您嘗試向應(yīng)用程序中添加AppleScript支持,則會(huì)發(fā)現(xiàn)自己希望使用其他標(biāo)準(zhǔn)。

5、分布式對(duì)象:就像Objective-C,但它發(fā)生在那! DO為您提供了可以像本地對(duì)象一樣使用的代理對(duì)象(大多數(shù)情況下),它們的語(yǔ)法和所有內(nèi)容都完全相同,只是您的消息飛到另一個(gè)進(jìn)程并在那里執(zhí)行。 DO通常在馬赫端口上運(yùn)行,但也可以與套接字一起使用,從而使其也可以在計(jì)算機(jī)之間工作。DO確實(shí)是很酷的技術(shù),當(dāng)人們從諸如Java或C ++之類(lèi)的次要語(yǔ)言進(jìn)入Objective-C時(shí),DO往往會(huì)引起人們的注意。不幸的是,DO確實(shí)又老又脆弱,而且往往異常不可靠。與套接字一起使用它與遠(yuǎn)程計(jì)算機(jī)通信時(shí)尤其如此,但在本地使用它時(shí)甚至如此。 DO也是完全非模塊化的,因此基本上不可能交換它用于自定義內(nèi)容的IPC機(jī)制(例如,如果要加密流)。僅了解其工作原理是值得研究的,盡管缺點(diǎn)在某些情況下仍然非常有用。

6、分布式通知:這些是簡(jiǎn)單的單向消息,本質(zhì)上會(huì)廣播到正在監(jiān)聽(tīng)它們的會(huì)話中的任何進(jìn)程。極易使用,并且有Cocoa和CoreFoundation兩種方式。 (并且它們可以互操作?。┤秉c(diǎn)是它們不能保證交付,并且它們非常占用資源,因?yàn)榭赡軙?huì)向系統(tǒng)中的每個(gè)應(yīng)用程序發(fā)送消息。它們完全不適合將大圖傳輸?shù)搅硪粋€(gè)過(guò)程,但是對(duì)于簡(jiǎn)單的一次性事件(例如“我剛剛更改了偏好,現(xiàn)在重新閱讀”)非常有用。在內(nèi)部,這是通過(guò)使用Mach端口與集中式通知服務(wù)器進(jìn)行通信來(lái)實(shí)現(xiàn)的,該服務(wù)器管理將通知發(fā)送到他們想去的位置的任務(wù)。

7、Pasteboard:可能是您最常使用的IPC機(jī)制。每次在應(yīng)用程序之間復(fù)制和粘貼內(nèi)容時(shí),就會(huì)發(fā)生IPC!應(yīng)用程序間拖放操作也使用粘貼板,并且可以創(chuàng)建自定義粘貼板以在應(yīng)用程序之間來(lái)回傳遞數(shù)據(jù)。類(lèi)似于分布式通知,粘貼板通過(guò)使用mach端口與中央粘貼板服務(wù)器通信來(lái)工作。

那么哪一個(gè)適合您呢?好吧,這一切都取決于您在做什么。多年來(lái),我?guī)缀醵际褂眠@些工具來(lái)完成不同的事情。您必須查看哪個(gè)最適合您的問(wèn)題,并且我希望以上內(nèi)容為您提供一個(gè)入門(mén)的好地方。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容