linux向應用軟件提供下列進程間通信手段:
####第一類通信方式:只能用于父進程與子進程之間,或者兩個兄遞進程之間。
>管道Pipe
>信號Signal
>跟蹤Trace
管道:由父進程來建立。管道兩端的進程各自都將該管道視作一個文件。一個進程往管道中寫的內容由另一個進程從管道中讀取,通過管道傳遞的內容遵循先入先出FIFO的規則。每個管道都是單向的,需要雙向通信時就要建立起兩個管道。
信號:signal可用于進程間通信,也用于內核與進程之間的通信(內核只能向進程發送信號而不能接收)。發送信號時需要用到對方的pid,而一般只有父子進程才知道對方的pid,所以實際上還是只能用于父子進程。
跟蹤:一個進程可以通過系統調用ptrace()讀/寫其子進程地址空間中的內容,從而達到跟蹤子進程執行的目的。跟蹤是單向的。
第二種通信方式:
>命名管道Named Pipe
>報文Message
>共享內存
>信號量Semaphore
>套接字Socket
命名管道:命名管道以FIFO文件的形式出現在文件系統中,所以任何進程都可以通過使用其文件名來打開管道,然后進行讀寫。
報文隊列:一個進程可以通過系統調用設立一個報文隊列。任何進程都可以通過系統調用向這個隊列發送消息或從隊列中接收信息,從而以進程間報文傳遞的形式實現通信。
共享內存:一個進程可以通過系統調用設立一片共享內存區,然后其它進程就可以通過系統調用將該存儲區映射到其用戶地址空間中。
套接字:socket可以用來實現分布于不同計算機中的進程通過網絡進行的通信。只要雙方都有一樣的套接字,并且兩個套接字之間有通信線路相連接,就可以完成雙方通信。socket相當于管道兩端的閥門。
>socket原語:
SOCKET:創建一個新的通信端點
BIND:將一個本地地址關聯到一個套接字
LISTEN:宣布愿意接受連接,指定隊列大小
ACCEPT:阻塞調用方,直到有連接到來
CONNECT:主動嘗試建立連接
RECV:從指定連接中接收數據
SEND:在指定連接上發送數據
CLOSE:釋方指定的連接