一.程序通訊之-管道
二.程序通訊之-訊息佇列
.程序通訊之-共享記憶體
概述:訊息佇列的讀取和寫入的過程,都會有發生使用者態與核心態之間的訊息拷貝過程。那共享記憶體的方式,就很好的解決了這一問題
原理:共享記憶體的機制,就是拿出一塊虛擬位址空間來,對映到相同的物理記憶體中。
四.程序通訊之-訊號量
用了共享記憶體通訊方式,帶來新的問題,那就是如果多個程序同時修改同乙個共享記憶體,很有可能就衝突了。例如兩個程序都同時寫乙個位址,那先寫的那個程序會發現內容被別人覆蓋了。
為了防止多程序競爭共享資源,而造成的資料錯亂,所以需要保護機制,使得共享的資源,在任意時刻只能被乙個程序訪問。正好,訊號量就實現了這一保護機制。
訊號量其實是乙個整型的計數器,主要用於實現程序間的互斥與同步,而不是用於快取程序間通訊的資料。
訊號量表示資源的數量,控制訊號量的方式有兩種原子操作:
具體過程:
程序 a 在訪問共享記憶體前,先執行了 p 操作,由於訊號量的初始值為 1,故在程序 a 執行 p 操作後訊號量變為 0,表示共享資源可用,於是程序 a 就可以訪問共享記憶體。
若此時,程序 b 也想訪問共享記憶體,執行了 p 操作,結果訊號量變為了 -1,這就意味著臨界資源已被占用,因此程序 b 被阻塞。
直到程序 a 訪問完共享記憶體,才會執行 v 操作,使得訊號量恢復為 0,接著就會喚醒阻塞中的執行緒 b,使得程序 b 可以訪問共享記憶體,最後完成共享記憶體的訪問後,執行 v 操作,使訊號量恢復到初始值 1。
同步:訊號初始化為 0,就代表著是同步訊號量,它可以保證程序 a 應在程序 b 之前執行
具體過程:
如果程序 b 比程序 a 先執行了,那麼執行到 p 操作時,由於訊號量初始值為 0,故訊號量會變為 -1,表示程序 a 還沒生產資料,於是程序 b 就阻塞等待;
接著,當程序 a 生產完資料後,執行了 v 操作,就會使得訊號量變為 0,於是就會喚醒阻塞在 p 操作的程序 b;
最後,程序 b 被喚醒後,意味著程序 a 已經生產了資料,於是程序 b 就可以正常讀取資料了。
五.程序通訊之-訊號
執行在 shell 終端的程序,我們可以通過鍵盤輸入某些組合鍵的時候,給程序傳送訊號。例如
ctrl+c 產生 sigint 訊號,表示終止該程序;
ctrl+z 產生 sigtstp 訊號,表示停止該程序,但還未結束;
如果程序在後台執行,可以通過 kill 命令的方式給程序傳送訊號,但前提需要知道執行中的程序 pid 號,例如:
kill -9 1050 ,表示給 pid 為 1050 的程序傳送 sigkill 訊號,用來立即結束該程序;
執行預設操作。linux 對每種訊號都規定了預設操作,例如,上面列表中的 sigterm 訊號,就是終止程序的意思。core 的意思是 core dump,也即終止程序後,通過 core dump 將當前程序的執行狀態儲存在檔案裡面,方便程式設計師事後進行分析問題在**。
捕捉訊號。我們可以為訊號定義乙個訊號處理函式。當訊號發生時,我們就執行相應的訊號處理函式。
忽略訊號。當我們不希望處理某些訊號的時候,就可以忽略該訊號,不做任何處理。有兩個訊號是應用程序無法捕捉和忽略的,即sigkill和segstop,它們用於在任何時候中斷或結束某一程序。*
六.程序通訊之-socket
前面提到的管道、訊息佇列、共享記憶體、訊號量和訊號都是在同一臺主機上進行程序間通訊,那要想跨網路與不同主機上的程序之間通訊,就需要 socket 通訊了。
實際上,socket 通訊不僅可以跨網路與不同主機的程序間通訊,還可以在同主機上程序間通訊。
可根據建立 socket 的型別不同,分為三種常見的通訊方式,乙個是基於 tcp 協議的通訊方式,乙個是基於 udp 協議的通訊方式,乙個是本地程序間通訊方式。
七.那麼執行緒之間的通訊方式呢?
以上,就是程序間通訊的主要機制了。你可能會問了,那執行緒通訊間的方式呢?
程序之間的8種通訊方式
現在最常用的程序間通訊的方式有訊號 資訊量 訊息佇列 共享記憶體等。程序通訊,就是不同程序之間進行一些 接觸 它們使用的方法基本是相同的,所以只要掌握了一種使用方法,然後記住其他的即可。訊號和訊號量是不同的,它們雖然都可以用來同步和互斥,但是訊號是使用訊號處理器來進行的,訊號量是使用p,v操作來實現...
程序之間的通訊方式
1 管道 pipe 管道可用於具有親緣關係程序間的通訊,允許乙個程序和另乙個與它有共同祖先的程序之間進行通訊。2 命名管道 name pipe 命名管道克服了沒有名字的限制,因此,除了具有管道所擁有的功能外,它還允許無親緣關係程序間同通訊。命名管道在檔案系統中有對應的檔名。命名管道通過命令mkfif...
程序之間的通訊方式
資料傳輸 資源共享 通知事件 程序控制 是管道的意思,它的作用就是把前一條命令的輸出作為後一條命令的輸入。如果兩個程序要通訊的話,可以使用這種管道進行通訊,因為 沒有名字,所以成為匿名管道,匿名管道一般用於有父子程序關係的程序中 並且這種通訊方式是單向的,只能把第乙個命令的輸出作為第二個命令的輸入,...