主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為0表示沒有資源可以用,該程序應當休眠等待訊號量的值再次為正。
linux中的訊號量使用起來是比較麻煩的。在這裡,訊號量是以集合形式存在的,建立時要給出訊號量的數目,並且訊號量集合即使沒有任何程序訪問時,也是存在於系統中的。要注意對其的銷毀工作。
每個訊號量由以下結構體定義:
struct ;
struct ipc_perm ;
獲取訊號量集合的識別符號:
#inlcude
int semget(key_t key,int nsems,int flag);
該函式返回給定鍵的訊號量對應的識別符號。鍵與識別符號實際上都指向了該訊號量集合,但是識別符號只是在該程序內部可見,而鍵是所有程序都可以使用獲取的。如果其他程序也是通過該識別符號對訊號量集合進行訪問,key可以指定為ipc_private或者ipc_new,比如父子程序的情況。多數情況下,其他程序不方便使用另一程序的識別符號,可以呼叫semget函式指定同一的key,以訪問訊號量集合。flag在建立的時候低9bit表示許可權,和creat建立時需要的許可權位定義相同。當flag為0時只表示獲取該訊號量集合,不進行建立。
#include
key_t ftok(const char *path, int id);
該函式用以建立key。path應當是已經存在的檔案,id理解為專案id。注意如果使用同一專案id,對於不同的路徑可能會產生相同的key。
#include
int semctl(int semid, int semnum,int cmd,/*union semun arg */);
用以操作訊號量集合,semget之後,應該使用semctl進行初始化。
注意下面這個結構體需要由使用者自行定義。
union semun ;
cmd主要有setval ipc_stat ipc_set getall setall getpid
ipc_rmid 刪除該訊號量集合。此時正在使用該訊號量集合的其他程序對齊操作時會返回eirm.
#include
int semop(int semid
, struct sembuf semoparray
,size_t nops
); //原子操作
struct sembuf ;
sem_op 為正:程序釋放占用資源,sem_op值加到訊號量上去.
為負:如果訊號量值大於等於sem_op絕對值,則減去。如果小於,如果指定了ipc_nowait,semop出錯返回。如果未指定,則呼叫程序被掛起,直到符合給定的條件或者訊號量被刪除/程序從其他訊號退出。
為0:表示等待到訊號量變為0.
如果在sem_op小於零時指定了sem_undo,即使程終止時未主動釋放資源,核心會釋放加入sem_undo時占用的資源。
簡單的例項**:
程序a,建立,占用,程序b等待。
#include
#include
#include
#include
union semun ;
int main()
int sid = -1;
if((sid = semget(sem_key,1,660)) < 0 )
union semun arg = ;
arg.val = 1;
if(semctl(sid,0,setval,arg.val) < 0)
struct sembuf arr[1];
arr[0].sem_num = 0;
arr[0].sem_op = -1;
arr[0].sem_*** = 0;
if(semop(sid,arr,1) < 0)
sleep(5);
arr[0].sem_op = 1;
if(semop(sid,arr,1) < 0)
printf("progam1 over/n");
return 0;
}//程序b
#include
#include
#include
#include
int main()
int sid = -1;
if((sid = semget(sem_key,1,0)) < 0 )
struct sembuf arr[1];
arr[0].sem_num = 0;
arr[0].sem_op = -1;
arr[0].sem_*** = 0;
if(semop(sid,arr,1) < 0)
arr[0].sem_op = 1;
if(semop(sid,arr,1) < 0)
printf("progam2 over/n");
return 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 訊...