天天看點

Linux下程序通信的八種方法:

Linux下程序通信的八種方法:管道(pipe),命名管道(FIFO),記憶體映射(mapped memeory),消息隊列(message queue),共享記憶體(shared memory),信号量(semaphore),信号(signal),套接字(Socket).

(1) 管道(pipe):管道允許一個程序和另一個與它有共同祖先的程序之間進行通信;

(2) 命名管道(FIFO):類似于管道,但是它可以用于任何兩個程序之間的通信,命名管道在檔案系統中有對應的檔案名。命名管道通過指令mkfifo或系統調用mkfifo來建立;

(3) 信号(signal):信号是比較複雜的通信方式,用于通知接收程序有某種事情發生,除了用于程序間通信外,程序還可以發送信号給程序本身;Linux除了支援UNIX早期信号語義函數signal外,還支援語義符合POSIX.1标準的信号函數sigaction(實際上,該函數是基于BSD的,BSD即能實作可靠信号機制,又能夠統一對外接口,用sigaction函數重新實作了signal函數的功能);

(4) 記憶體映射(mapped memory):記憶體映射允許任何多個程序間通信,每一個使用該機制的程序通過把一個共享的檔案映射到自己的程序位址空間來實作它;

(5) 消息隊列(message queue):消息隊列是消息的連接配接表,包括POSIX消息對和System V消息隊列。有足夠權限的程序可以向隊列中添加消息,被賦予讀權限的程序則可以讀走隊列中的消息。消息隊列克服了信号承載資訊量少,管道隻能成該無格式位元組流以及緩沖區大小受限等缺點;

(6) 信号量(semaphore):信号量主要作為程序間以及同程序不同線程之間的同步手段;

(7) 共享記憶體 (shared memory):它使得多個程序可以通路同一塊記憶體空間,是最快的可用IPC形式。這是針對其他通信機制運作效率較低而設計的。它往往與其他通信機制,如信号量結合使用,以達到程序間的同步及互斥;

(8) 套接字(Socket):它是更為通用的程序間通信機制,可用于不同機器之間的程序間通信。起初是由UNIX系統的BSD分支開發出來的,但現在一般可以移植到其他類UNIX系統上:Linux和System V的變種都支援套接字;

繼續閱讀