-
1 # Wumimi6
-
2 # 中國科技說
Linux環境下的程序間通訊(Inter-Process Communication,簡稱IPC)有多種工具可以使用,如:無名管道pipe、命名管道FIFO、訊息佇列、共享記憶體、訊號量、訊號、檔案鎖、socket等。這些IPC工具以系統呼叫或庫函式API的形式提供給使用者使用:使用者使用這些API可以在不同的程序之間傳輸資料、同步程序、或者傳送訊號。比如,我們可以使用ctrl+C組合鍵去終止一個程序,或者使用shell命令kill 3567去殺死一個程序pid為3567的程序,這些其實都是給程序傳送訊號,程序接收訊號並進行處理的過程
si_signo是訊號的編號,從1到64的值都是合法的。
_sifields對不同的訊號會有不同的含義,通常包括訊號傳送程序的si_pid,傳送程序所屬user的si_uid等。對於由sigqueue()傳送的訊號,還包括"sigval "引數所攜帶的附加資訊。
核心在截獲到一個程序傳送的訊號後,會首先做一系列的檢查,比如該訊號的值是否合法啦,程序有沒有傳送這個訊號的許可權啦。如果檢查透過,就呼叫copy_from_user()將該訊號的相關資訊複製到siginfo_t結構體中。接下來就是將訊號向目標程序遞送(deliver),Linux提供了 15種以上 程序間通訊的機制:管道、訊息佇列、共享記憶體、訊號量、訊號、socket...。由於歷史原因,Linux下不同的程序間通訊機制除了支援和相容system V 和 POSIX規定的標準外,Linux還擴充套件了自己的程序間通訊的介面,如signalfd、timerfd、eventfd等。
每一種通訊機制都有自己的優缺點,使用場合、使用侷限。有些現在基本不用了,有種要拋棄的趨勢。但是從學習的角度,建議還是都要系統地學習一下,瞭解一下,因為:
雖然有些IPC工具有缺陷,使用得少了,但實際工作中,尤其是以前的老程式碼中,還是大量存在的,需要維護、更新
現在流行的各種庫、開發框架,它們的實現還是需要去呼叫這些程序間通訊的底層API介面
只有瞭解和熟悉了各個IPC工具的使用,才能在實際工作中根據需要,選擇最合適的通訊機制。
回覆列表
執行緒間通訊就是透過全域性變數啊,執行緒之間沒有“通訊”的說法吧,不管有幾個執行緒,它們都是在同一個程序地址空間內,都共享同樣的記憶體空間,所以“通訊”的說法才多見於程序之間,因為不同的程序才是不同的記憶體地址空間。程序內的變數每個執行緒都是可以訪問的,是共享的,但是執行緒之間沒有固定的執行順序,為避免時序上的不同步問題,所以執行緒之間才會需要同步機制。執行緒之間的重點就是同步機制。