作業系統程序間通訊的方式

2021-06-20 20:25:23 字數 2418 閱讀 9403

程序間的四種通訊方式:

1>管道,fifo

管道(pipe)是一種具有兩個端點的通訊通道:有一端控制代碼的程序可以和有另一

端控制代碼的程序通訊。管道可以是單向-一端是唯讀的,另一端點是只寫的;也可以

是雙向的一管道的兩端點既可讀也可寫。

匿名管道(anonymous pipe)是 在父程序和子程序之間,或同一父程序的兩個子

程序之間傳輸資料的無名字的單向管道。通常由父程序建立管道,然後由要通訊的

子程序繼承通道的讀端點控制代碼或寫 端點控制代碼,然後實現通訊。父程序還可以建立兩

個或更多個繼承匿名管道讀和寫控制代碼的子程序。這些子程序可以使用管道直接通訊

,不需要通過父程序。

匿名管道是單機上實現子程序標準i/o重定向的有效方法,它不能在網上使用,

也不能用於兩個不相關的程序之間

命名管道(named pipe)是伺服器程序和乙個或多個客戶程序之間通訊的單向或

雙向管道。不同於匿名管道的是命名管道可以在不相關的程序之間和不同計算機之

間使用,伺服器建立命名管道時給它指定乙個名字,任何程序都可以通過該名字打

開管道的另一端,根據給定的許可權和伺服器程序通訊。

命名管道提供了相對簡單的程式設計介面,使通過網路傳輸資料並不比同一計算機

上兩程序之間通訊更困難,不過如果要同時和多個程序通訊它就力不從心了。

管道 和 fifo是一樣的,只是匿名管道需要在 父子程序間使用,fifo是增強

型的管道,適合傳遞較小的訊息,fifo實際相當於核心內部實現的乙個共享檔案。

2>訊號

訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於進

程間通訊外,程序還可以傳送訊號給程序本身。除了系統核心和root之外,只有具

備相同uid、gid的程序才可以使用訊號進行通訊。

/etc/passwd:uid與賬號對應

/etc/group:gid與群組對應

3> 訊息佇列

訊息佇列是訊息的鏈結表,包括posix訊息佇列systemv訊息佇列。有足夠許可權

的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。消

息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限

等缺。4> 共享記憶體

使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通

信機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到

程序間的同步及互斥。

傳遞檔案最好是用共享記憶體的方式,map_shared可以提供多程序共享乙個檔案的能

力。管道 和 fifo 是一樣的,只是匿名管道需要在 父子程序間使用,fifo是增強型的

管道,適合傳遞較小的訊息,fifo實際相當於核心內部實現的乙個共享檔案。

訊號,嚴重的不建議使用,尤其是你的執行緒庫不能做到非同步安全的時候,使用訊號

作為通訊方式很容易導致系統死鎖。

訊息佇列 與 fifo 相似,是在fifo的基礎上封裝的乙個訊息結構佇列。

建議使用 fifo 或訊息佇列傳遞控制型別的訊息(資料量小,有明確的資料結構)

使用共享記憶體傳遞資料型別的訊息(資料量大,資料結構多變)

linux下程序間通訊的幾種主要手段簡介:

管道(pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;

訊號(signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援unix早期訊號語義函式sigal外,還支援語義符合posix.1標準的訊號函式sigaction(實際上,該函式是基於bsd的,bsd為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);

報文(message)佇列(訊息佇列):訊息佇列是訊息的鏈結表,包括posix訊息佇列system v訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用ipc形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

套介面(socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由unix系統的bsd分支開發出來的,但現在一般可以移植到其它類unix系統上:linux和system v的變種都支援套接字。

或許你會有疑問,那多執行緒間要通訊,應該怎麼做?前面已經說了,多數的多執行緒都是在同乙個程序下的,它們共享該程序的全域性變數,我們可以通過全域性變數來實現執行緒間通訊。如果是不同的程序下的2個執行緒間通訊,直接參考程序間通訊。

作業系統 程序間的通訊方式

程序間的通訊方式 1.管道 pipe 及有名管道 named pipe 管道可用於具有親緣關係程序間的通訊,有名管道除了具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。2.訊號 signal 訊號是在軟體層次上對中斷機制的一種模擬,它是比較複雜的通訊方式,用於通知程序有某事件發生,乙個程序收...

作業系統 程序間通訊

程序間通訊涉及到3個問題 1.乙個程序如何把資訊傳遞給另乙個程序 2.確保兩個或多個程序之間不會在關鍵活動中出現交叉 3.程序間執行的順序對執行結果的影響。注意 確保程序對臨界區的 互斥 訪問。忙等待的互斥 1.遮蔽中斷 當乙個程序進入臨界區後立即遮蔽所有中斷,時鐘中斷也被遮蔽 這樣cpu就不會進行...

作業系統 程序間通訊

include include include include include include ifndef semun h 條件編譯,即若semun在標頭檔案中沒有被定義,就進行下面的編譯 define semun h union semun endif static int set semval...