Linux程序通訊 訊號量

2021-08-18 01:59:08 字數 3175 閱讀 8847

訊號量是乙個核心變數,它可以被系統中的任何程序所訪問。程序間可以使用這個變數來協調對於共享記憶體和其他資源的訪問。

如果不刪除訊號量,它將繼續在系統中存在,即使程式已經退出,它可能在你下次執行此程式時引發問題,而且訊號量是一種有限的資源。

簡單的例子

父程序與子程序共享印表機,必須其中一者列印完後,另一者再列印。

#include 

#include

#include

#include

#include

#include

#include

int p(int semid, int who)

int v(int semid, int who)

int main()

// 建立訊號量集

// semset_id = semget(key_t key, int numsems, int flags);

// key:所建立或開啟訊號量集的鍵值,也可以有函式 ftok 生成

// numsems:表示建立的訊號量集中訊號量的個數,該引數只在建立訊號量集時有效

// flags:

// ipc_creat: 如果ipc存在,則開啟它,若不存在,則建立ipc資源。

// ipc_excl: 不能單獨使用,沒有意義;當與ipc_creat搭配使用時表示:

// 若ipc不存在則建立ipc資源,若存在,則產生錯誤。

int semid = semget(key, 1, ipc_creat|ipc_excl|0666);

if(semid < 0)

// 初始化訊號量

// 執行在訊號量集上的控制操作

// semctl(int semset_id, int semnum, int cmd, union semun arg)

// semset_id:訊號量集ipc識別符號,因為訊號量一般是作為乙個訊號量集使用的,而不是乙個單獨的訊號量

// semnum:集合中某特定訊號量的編碼,第乙個訊號為0

// cmd:控制命令:

// ipc_stat 讀取乙個訊號量集的資料結構semid_ds,並將其儲存在semun中的buf引數中。

// ipc_set 設定訊號量集的資料結構semid_ds中的元素ipc_perm,其值取自semun中的buf引數。

// ipc_rmid 將訊號量集從記憶體中刪除。

// getall 用於讀取訊號量集中的所有訊號量的值。

// getncnt 返回正在等待資源的程序數目。

// getpid 返回最後乙個執行semop操作的程序的pid。

// getval 返回訊號量集中的乙個單個的訊號量的值。

// getzcnt 返回這在等待完全空閒的資源的程序數目。

// setall 設定訊號量集中的所有的訊號量的值。

// setval 設定訊號量集中的乙個單獨的訊號量的值。

// arg:控制命令的引數

if(semctl(semid, 0, setval, 1) < 0)

pid_t id = fork();

if(id == 0)

while(1)

}else

wait(null);

}// 刪除訊號量

乙個讀者、乙個寫者寫者

#include 

#include

#include

#include

#include

#include

void wait_and_lock(int semset_id)

}void release_lock(int semset_id)

}int main()

// 初始化讀者訊號量

if(semctl(semset_id, 0, setval, 0) < 0)

// 初始化寫者訊號量

if(semctl(semset_id, 1, setval, 0) < 0)

wait_and_lock(semset_id);

for(int i=0; i<3; ++i)

release_lock(semset_id);

// 刪除訊號量集

if(semctl(semset_id, 0, ipc_rmid, null) == -1)

return

0;}

讀者

#include 

#include

#include

#include

#include

#include

void wait_and_lock(int semset_id)

}void release_lock(int semset_id)

}int main()

wait_and_lock(semset_id);

printf("read\n");

release_lock(semset_id);

// 不需要刪除訊號量集

寫者先執行完後,讀者才開始讀。但讀者出現semop: unlocking : invalid argument,不知道是什麼原因。

出現「semget : file exists」的解決方式

參考 unix/linux程式設計實踐教程 bruce molay

Linux程序通訊 訊號量

主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為0表示沒有資源可以用,該程序應當休眠等待訊號量的值再次為正。linux中的訊號量使用起來是比較麻煩的。在這裡,訊號量是以集合形式存在的,建立時要給出訊號量的數目,...

Linux 程序通訊 訊號量

基本概念 訊號量和p,v 原語 訊號量 訊號量值的含義 訊號量結構偽 訊號量的本質是乙個計數器 struct semaphore p原語 p s v原語 v s 訊號量有關函式 建立或開啟訊號量 設定初值 銷毀訊號量 union semun union senun su su.val 1 檢視訊號量...

linux程序通訊 訊號量

訊號量 程序間或執行緒間同步 講的是system v裡面的訊號量 二值訊號量 只有0和1兩個值 1 0計數訊號量 有n個值 4 3 2 1 0 圖書館借書 借出書 n 1 程序申請訊號量 p操作 歸還書 n 1 程序釋放訊號量 v操作 p 操作 v 操作 等0操作 書都被借完了 system v 訊...