進程間通訊就是在不同進程之間傳播或交換訊息,那麼不同進程之間存在著什麼雙方都可以存取的介質呢?進程的使用者空間是互相獨立的,一般而言是不能互相存取的,唯一的例外是共享記憶體區。但是,系統空間是“公共場所”,所以核心顯然可以提供這樣的條件。除此之外,那就是雙方都可以訪問的周邊了。在這個意義上,兩個進程當然也可以透過磁碟上的普通檔案交換訊息,或透過「註冊表」或其它資料庫中的某些表項和記錄交換資訊。廣義上這也是進程間通訊的手段,但是一般都不把這算作「進程間通訊」。因為那些通訊手段的效率太低了,而人們對進程間通訊的要求是要有一定的即時性。
相關推薦:《php教學》
Linux下進程間通訊的幾種主要手段:
1、管道(Pipe)及有名管道(named pipe)
管道可用於具有親緣關係進程間的通信,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係進程間的通訊。
管道包含三種:
(1)普通管道PIPE:通常有種限制,一是半雙工,只能單向傳輸;二是只能在父子進程間使用。
(2)流管道s_pipe:去除了第一種限制,可以雙向傳輸。
(3)命名管道name_pipe:去除了第二種限制,可以在許多不相關的程序之間進行通訊。
2、訊號(Signal)
訊號是比較複雜的通訊方式,用來通知接受行程有某種事件發生,除了用於行程間通訊外,進程還可以發送訊號給進程本身;Linux除了支援Unix早期訊號語義函數sigal外,還支援語意符合Posix.1標準的訊號函數sigaction(實際上,該函數是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外接口,用sigaction函數重新實作了signal函數)。
3、封包(Message)佇列(訊息佇列)
#訊息佇列是訊息的連結表,包含Posix訊息佇列systemV訊息佇列。有足夠權限的進程可以為佇列中新增訊息,而被賦予讀取權限的進程則可以讀走佇列中的消息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
4、共享記憶體
使得多個行程可以存取同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制運作效率較低而設計的。往往與其它通訊機制,如信號量結合使用,來達到進程間的同步及互斥。
5、信號量(semaphore)
主要作為進程間以及同一進程不同執行緒之間的同步手段。
6、套介面(Socket)
更為一般的進程間通訊機制,可用來不同機器之間的進程間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援套接字。
以上是php進程間通訊有幾種方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!