进程间通信之3----信号量
生活随笔
收集整理的這篇文章主要介紹了
进程间通信之3----信号量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
進程間通信之3----信號量
信號量分為以下三種。 1、System V 信號量,在內核中維護,可用于進程或線程間的同步,常 ?? 用于進程的同步。 2、Posix 有名信號量,?可用于進程或線程間的同步, 常用于線程。 3、Posix 基于內存的信號量,存放在共享內存區中,可用于進程或線程間的同步。
為了獲得共享資源進程需要執行下列操作: (1)測試控制該資源的信號量。 (2)若信號量的值為正,則進程可以使用該資源。進程信號量值減 ?????1,表示它使用了一個資源單位。此進程使用完共享資源后對應 ? ? ?????的信號量會加 1。以便其他進程使用。 (3)若信號量的值為0,則進程進入休息狀態,直至信號量值大于 ?????0。進程被喚醒,返回第(1)步。
函數原型: #include <sys/sem.h> #include <sys/ipc.h> #include <sys/types.h> int semget(key_t key,int nsems,int flag); int semop(int semid,struct sembuf *sops,size_t num_sops); int semctl(int semid, int semnum, int cmd, …);
1、信號量
信號量分為以下三種。 1、System V 信號量,在內核中維護,可用于進程或線程間的同步,常 ?? 用于進程的同步。 2、Posix 有名信號量,?可用于進程或線程間的同步, 常用于線程。 3、Posix 基于內存的信號量,存放在共享內存區中,可用于進程或線程間的同步。
為了獲得共享資源進程需要執行下列操作: (1)測試控制該資源的信號量。 (2)若信號量的值為正,則進程可以使用該資源。進程信號量值減 ?????1,表示它使用了一個資源單位。此進程使用完共享資源后對應 ? ? ?????的信號量會加 1。以便其他進程使用。 (3)若信號量的值為0,則進程進入休息狀態,直至信號量值大于 ?????0。進程被喚醒,返回第(1)步。
函數原型: #include <sys/sem.h> #include <sys/ipc.h> #include <sys/types.h> int semget(key_t key,int nsems,int flag); int semop(int semid,struct sembuf *sops,size_t num_sops); int semctl(int semid, int semnum, int cmd, …);
- 函數semget創建一個信號量集或訪問一個已存在的信號量集。 返回值:成功時,返回一個稱為信號量標識符的整數,semop 和 semctl 會使用它;出錯時,返回-1。
- 參數 key 是唯一標識一個信號量的關鍵字,如果為 IPC_PRIVATE(值為0,創建一個只有創建者進程才可以訪問的信號量, 通常用于父子進程之間;非0值的key,表示創建一個可以被多個進程共享的信號量。
- 參數flag是一組標志,還可以與鍵值IPC_CREAT按位或操作,以創建一個新的信號量。也可以通過 IPC_CREAT 和 IPC_EXCL標志的聯合使用確保自己將創建出一個新的獨一無二的信號量。
- 函數 semop 用于改變信號量對象中各個信號量的狀態。返回值:成功時,返回 0;失敗時,返回-1.參數 semid 是由 semget 返回的信號量標識符。參數sops是指向一個結構體數組的指針。每個數組元素至少包含以下幾個成員:
- struct sembuf{
-
- short sem_num; //操作信號量在信號量集合中的編號, 第一個信號量的編號是 0。
- short sem_op; //sem_op 成員的值是信號量在一次操作中需要改變的數值。通常只會用到兩個值,一個是-1, 也就是 p 操作,它等待信號量變為可用;一個是+1,也就是 v 操作,它發送信號通知信號量現在可用。
- short sem_flg; //通常設為:SEM_UNDO,程序結束, 信號量為semop調用前的值。
- };
- 參數 nops為sops指向的sembuf結構體數組的大小。函數 semctl 用來直接控制信號量信息。參數 semid 是由 semget 返回的信號量標識符。參數 semnum 為集合中信號量的編號, 當要用到成組的信號量時,從0開始。一般取值為0,表示這是第一個也是唯一的一個信號量。參數cmd為執行的操作。通常為:IPC_RMID(立即刪除信號集,喚醒所有被阻塞的進程)、 GETVAL(根據semun返回信號量的值,從0 開始,第一個信號量編號為0)、SETVAL(根據 semun 設定信號的值,從0開始,第一個信號量編號為0)、GETALL(獲取所有信號量的值, 第二個參數為0,將所有信號的值存入semun.array中)、SETALL(將所有 semun.array的值設定到信號集中,第二個參數為 0)等。
總結
以上是生活随笔為你收集整理的进程间通信之3----信号量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习及大数据经典算法笔记汇总
- 下一篇: Range头