Linux程序通訊 訊號量

2021-05-23 04:47:17 字數 2443 閱讀 1262

主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為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 訊...