程序間通訊 管道 訊號量

2021-09-25 16:34:17 字數 1022 閱讀 1392

管道:

有名管道:任意兩個程序之間通訊mkfifo  

無名管道:父子程序之間通訊pipe 

寫入管道的資料放在**?資料在記憶體中

通訊方式:半雙工(單工,半雙工,全雙工)

實現:讀完才能覆蓋

程式中:管道有固定的讀端和寫端

無名管道:

管道是基於檔案描述符的通訊方式,當乙個管道建立時,它會建立兩個檔案描述符fd[0]和fd[1],其中fd[0]固定用於讀管道,而fd[1]固定用於寫管道。

有名管道:

同上管道為空,讀read會阻塞

管道為滿,寫write會阻塞

操作管道時,要求讀端和寫端必須都存在

寫端關閉,讀read()直接返回,返回值0

讀端關閉,寫write()產生異常,收到sigpipe訊號

訊號量:特殊的變數,

1.建立訊號量semget

int semget(key_t key, int nsems, int sem***);

2.改變訊號量值semop

訊號量操作是pv 操作,「互斥」與「同步」

int semop(int semid, struct sembuf *sops, unsigned nsops);

3.控制訊號量semctrl

int semctl(int semid, int semnum, int cmd, ...);

p,v操作:

p操作,原子減一,獲取資源  

v操作,原子加一,釋放資源

訊號量是用來同步程序的

二值訊號量 值取0 或者1

計數訊號量 值可以大於1

臨界資源:同一時間只允許乙個(有限個(試衣間))程序(執行緒)訪問的資源

臨界區:訪問臨界資源的**段

程序間通訊(管道 共享記憶體 訊息佇列 訊號量)

匿名管道 什麼是匿名管道?如何建立匿名管道 成功 返回0 失敗 返回 1 pipefd 0 從管道讀取資料 pipefd 1 向管道寫入資料 舉例 include include intmain pid t pid fork if pid 0 else if pid 0 else read pipe...

程序間通訊 訊號量

ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...

程序間通訊 訊號量

system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...