目前本人熟悉的、特定適用於父子程序之間的 ipc 方式有三種:pipe、匿名 fifo(unix domain socket)和共享記憶體。現在將使用方法總結一下。
1、管道
code:
[copy to clipboard]
$ cat -n pipe.c
1 #include
2 #include 3
4 int main ()
5 15
16 if ( fork() )
25 }
26 else
34 }
35 }
因為 pipe 只能進行單向傳遞的特性,popen(3) 的第二個引數只能為讀寫之一種,就是這個道理了。
2、socketpair
基本類似 pipe,不過是基於 unix domain socket,通訊為雙向通訊。
code:
[copy to clipboard]
$ cat -n socketpair.c
1 #include
2 #include 3
4 #include
5 #include 6
7 int main ()
8 16
17 if ( fork() )
29 }
30 else
39 }
40 }
linux 系統中,socketpair 的第乙個引數只能是 af_local / af_unix。
3、共享記憶體
傳統 sysv ipc 系列提供了 shared memory 實現,簡稱 sysv shm。它的優劣在 stevens 前輩的 apue 中都有了詳細介紹,此處不多做贅述。linux 2.4 及之後版本的核心提供了一種新的程序間共享記憶體方式:通過 mmap。指定 map_shared | map_anonymous,系統會建立一塊可被子程序繼承的共享匿名記憶體塊。它的優點是:與其它 mmap 分配的記憶體具有相同屬性:當附著程序執行 exec 或者退出的時候,記憶體會被系統自動收回,而不像 sysv shm 一樣仍然被保留在系統中。而且,由於不需要 key 來進行標識,它的 api 也相對更簡單清晰。直接看**好了。
code:
[copy to clipboard]
$ cat -n mmap.c
1 #include
2 #include 3
4 #include 5
6 int main ()
7 16
17 if ( fork() )
23 }
24 else
29 }
30 }
相比較之前兩種方式,共享記憶體有許多不同。首先,它不是通過檔案描述符進行標識,而是直接將虛擬頁面對映到程序記憶體空間中;傳遞資料也不需要在使用者空間 <-> 核心的三塊 buf 之間來回傳遞;其次,當執行 exec 之後,程序空間被全部重新生成,mmap 會自動脫離被對映的位址而不會繼續繼承;第三,與 sysvshm 一樣,使用過程需要其它的同步手段,而 pipe / socket 自身提供了同步機制。
以上是一點學習心得,歡迎指正。
程序間通訊(IPC)總結
管道 使用簡單 fifo 非血緣關係間 訊號 開銷小 共享記憶體 非血緣關係間 本地套接字 穩定性好 訊號 sinal 訊號是一種比較複雜的通訊方式,用於通知接收程序某個事件已經發生。unix domain socket是全雙工的,api介面語義豐富,相比其它ipc機制有明顯的優越性,目前已成為使用...
程序間通訊IPC
這兩天學習了 unix 的程序間通訊 ipc,這裡面有幾個很重要的基本概念,特別是訊息佇列和我的畢設很有關係,因此多說幾句。以前學習的程序間通訊方式,一般都是經由 fork 或exec 開啟檔案,或經過檔案系統。而 ipc是程序間通訊方式的統稱。下面一一道來。一 管道 管道是最老的 ipc形式。管道...
程序間通訊 IPC
part2 index1.html part2 index2.html linux至少支援如下ipc機制 同時支援posix和system v方式 streams ipc機制,linux本身不支援,有乙個單獨的安裝包 可以跨pc的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...