程序間通訊彙總筆記

2021-09-12 23:17:46 字數 2017 閱讀 2807

1.訊號(signal)

2.管道(pipe/fifo)

3.訊號量(semophore)

4.訊息佇列(message queue)

5.共享記憶體(shared memory)

6.套接字(socket)

訊號作業系統給程序傳送訊號,本質上是給程序的pcb中寫入資料,修改相應的pcb欄位,程序在合適的時間去處理所接受的訊號。我們模擬一下這樣的場景:

1)使用者輸入乙個命令,在shell下啟動乙個前台程序。

2)使用者按下ctrl-c,通過鍵盤輸入產生了乙個硬體中斷。

3)如果cpu當前正在執行此程序的**,則該程序的使用者空間**暫停執行,cpu從使用者態切換到核心態處理中斷。

4)終端驅動程式將ctrl-c解釋為乙個sigint訊號,記在該程序的pcb中。

5)當某個時刻從核心返回該程序的使用者空間**繼續執行之前,首先處理pcb中記錄的訊號。sigint訊號預設處理動作為終止訊號,所以直接終止程序而不再返回到它的使用者空間**。

ctrl-c所產生的訊號只能傳送給前台程序,如果想讓其在後台執行,需要在命令後面加上&。這樣shell不必等待程序結束就可以接受新的命令,啟動新的程序。

匿名管道之所以可以通訊的本質在於,父程序fork子程序,父子程序各自擁有乙個檔案描述符表,但是兩者的內容是一樣的,既然內容一致,那麼指向的就是同乙個管道,即父子程序看到了同乙份公共資源。

使用管道是有一些限制的,兩個程序通過乙個管道只能實現單向通訊。比如上述例子,父程序寫,子程序讀,如果需要子程序寫父程序讀,就必須另開乙個管道。

[匿名管道的5大特性]

①匿名管道只能單向通訊。

②管道只能進行有血緣關係的程序間通訊,通常用於父子程序。

③管道通訊依賴於檔案系統,即管道的生命週期隨程序。

④管道的通訊被稱為面向位元組流,與通訊格式沒有關係。

⑤自帶同步機制,保證讀寫順序一致。

[本質]:命名管道在某種程度上可以看做是匿名管道 ,但他打破了匿名管道只能在有血緣關係的程序間的通訊。命名管道之所以可以實現程序間通訊在於通過同乙個路徑名而看到同乙份資源,這份資源以fifo的檔案形式存在於檔案系統中。

值得注意的是,fifo總是按照先入先出的原則工作,第乙個被寫入的資料將首先從管道讀出。

#include

#include

int mkfifo(const char* filename,mode_t mode);

int mknod(const char* filename,mode_t mode | s_ififo,(dev_t)0);

1.訊號:(signal)是一種處理非同步事件的方式。訊號時比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序外,還可以傳送訊號給程序本身。

2.訊號量:(semaphore)程序間通訊處理同步互斥的機制。是在多執行緒環境下使用的一種設施, 它負責協調各個執行緒, 以保證它們能夠正確、合理的使用公共資源。

同步與互斥

為了防止多個程序同時訪問一塊各項資源而引發的一系列問題,我們需要一種可以通過它生成並使用令牌來授權,在任意時刻只能有乙個執行執行緒訪問**的臨界區。而訊號量則提供了這樣的機制讓乙個臨界區同一時間只有乙個執行緒在訪問,即訊號量是用來協調程序對資源的訪問的。

訊號量在本質上是一種資料操作鎖(計數器,記錄統計臨界資源的數目)。它本身不具備資料交換的功能,而是通過保護其他的通訊(檔案、外部裝置)等臨界資源來實現程序間通訊。訊號量在此過程中負責資料操作的互斥、同步等功能。

當請求乙個使用訊號量來表示的資源時,程序需要先讀取訊號量的值來判斷資源是否可用:

①訊號量 > 0:表示資源可用請求。

②訊號量 = 0:無資源可用,程序會進入睡眠狀態直至資源可用。

[生命週期]:訊號量的生命週期與訊息佇列一樣,不隨程序的結束而結束,而是隨核心的。

由於訊號量只能進行兩種操作等待和傳送訊號,即p(sv)和v(sv),sv為訊號量,它們的行為如下:

p(sv):如果sv的值大於零,就對其減1;如果它的值為零,就掛起該程序的執行。

v(sv):如果有其他程序因等待sv而被掛起,就讓它恢復執行;如果沒有程序因等待sv而掛起,就給它加1。

Linux 應用程式,程序間通訊彙總(IPC)

程序間通訊方式 1.通訊 管道 fifo,訊息佇列,共享記憶體,socket uds 管道一般用於有有親屬關係的程序間進行通訊。核心自動處理管道的同步問題。管道通訊資料為流模型,不能區分不同時間傳送的兩條訊息。可以定長傳送每條資料,或者定義訊息分隔符。fifo相對於管道,多了路徑名,任意程序都可訪問...

APUE筆記 程序間通訊

管道 include int pipe int fds 2 fd返回兩個檔案描述符,fd 0 讀,fd 1 寫!管道是單雙工的,只能一端寫,另一端讀,不能兩邊同時讀寫 管道實際上是在,核心中開闢了乙個迴圈佇列,當佇列寫滿 隊空 時,繼續寫 讀 管道會阻塞當前程序!當寫端關閉,繼續讀時返回eof 當讀...

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...