父子程序間 IPC 總結

2021-06-15 18:41:40 字數 1615 閱讀 9372

目前本人熟悉的、特定適用於父子程序之間的 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的程序通訊 互斥鎖或條件變數 動態初始化 不能使靜態分配 在共享記憶體中...