linux 訊號量 同步多程序

2021-07-24 14:26:15 字數 1701 閱讀 8772

訊號量集函式

#include

#include

#include

semget函式

功能:用來建立和訪問乙個訊號量集

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

引數key: 訊號集的名字

nsems:訊號集中訊號量的個數

sem***: 由九個許可權標誌構成,它們的用法和建立檔案時使用的mode模式標誌是一樣的

返回值:成功返回乙個非負整數,即該訊號集的標識碼;失敗返回-1

semctl 函式

功能:用於控制訊號量集

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

引數semid:由semget返回的訊號集標識碼

semnum:訊號集中訊號量的序號,從0開始

cmd:將要採取的動作(有三個可取值)

最後乙個引數根據命令不同而不同

返回值:成功返回0;失敗返回-1

semop函式

功能:用來建立和訪問乙個訊號量集

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

引數semid:是該訊號量的標識碼,也就是semget函式的返回值

sops:是個指向乙個結構數值的指標,通過甚至結構體的引數來告訴作業系統要如何進行訊號量操作

nsops:訊號量的個數

返回值:成功返回0;失敗返回-1

sembuf結構體:

struct sembuf ;

sem_num是訊號量的編號。

sem_op是訊號量一次pv操作時加減的數值,一般只會用到兩個值,乙個是「-1」,也就是p操作,等待訊號量變得可用;

另乙個是「+1」,也就是我們的v操作,發出訊號量已經變得可用

sem_flag的兩個取值是ipc_nowait或sem_undo

#include #include #include #include #include #include union semnu

;int semp(int sem_id)

int semv(int sem_id)

int main(void)

int sem_id = ret;

printf("success get sem_id = %d\n",sem_id);

union semnu un;

un.val = 1;

ret = semctl(sem_id, 0, setval, un);

if(ret < 0)

ret = semctl(sem_id, 0, getval, 0);

if(ret < 0)

int val = ret;

printf("get semnu val = %d\n",val);

fork();

fork();

fork();

semp(sem_id);

semv(sem_id);

return 0;

}

System V訊號量 多程序同步

1.概述 systemv訊號量並不如posix訊號量那樣 好用 但相比之下它的年代更加久遠,但是systemv使用的卻更加廣泛 尤其是在老系統中 在學習posix訊號量的時候,已經大概清楚了二值訊號量和計數訊號量是什麼東西。在接觸systemv訊號量之後,這裡有乙個新的概念叫做 計數訊號量集。其實就...

訊號量實現多程序的同步訪問

comm.h檔案 ifndef comm h define comm h include include include include include include include define pathname define proj id 06666 typedef union semun ...

linux 程序 訊號量

1.概述 該demo主要實現linux下程序之間訊號量的使用,相關介面介紹可以參考 2.測試 程序程式設計demo 訊號量 ipc相關的命令 ipcs ipcrm 釋放ipc 檢視程序屬性 ulimit a include include include include include includ...