訊號量是乙個核心變數,它可以被系統中的任何程序所訪問。程序間可以使用這個變數來協調對於共享記憶體和其他資源的訪問。
如果不刪除訊號量,它將繼續在系統中存在,即使程式已經退出,它可能在你下次執行此程式時引發問題,而且訊號量是一種有限的資源。
簡單的例子
父程序與子程序共享印表機,必須其中一者列印完後,另一者再列印。
#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 訊...