Linux進程間通信---信號量
阿新 • • 發佈:2018-04-17
creat 程序 pid == 對象 數據對象 tpi -- lee
- 信號量是一個計數器,通常在內核中實現,用於多個進程對共享數據對象的同步訪問。使用信號量的頭文件是#include <sys/sem.h>
- 信號量的使用規則:
- 若信號量為正,則進程可使用該資源。
- 若信號量為0,則進程阻塞等待,並將進程插入等待隊列,直到該信號量的值大於0從等待隊列中執行進程請求。
- 加鎖操作:如果信號量大於0,則信號量-1;如果信號量為0,則掛起該進程,並將這個進程插入等待隊列。
- 解鎖操作:如果等待隊列中有進程則喚醒該進程,讓它恢復運行;否則,信號量+1。
- Linux下使用信號量的常用函數:
- semget(key, num_sems, sem_flags):創建新的信號量或取得已有的信號量,key表示信號量的鍵值,不相關進程使用同一個key來訪問同一個信號量,num_sems表示信號量個數(一般為1),sem_flags表示信號量訪問權限,用IPC_CREAT與權限位與可保證信號量不存在時新建一個。函數返回一個int類型的數值,表示信號量的標識符。
- semop(sem_id, sem_opa, num_sem_ops):改變信號量的值,改變操作在sem_opa中,sem_opa是sumbuf結構體對象,使用方法如下:
struct sembuf { short sem_num; //除非使用一組信號量,否則它為0 short sem_op; //信號量在一次操作中需要改變的數據,通常是兩個數,一個是-1,即P操作(加鎖);一個是+1,即V操作(解鎖) short sem_flg; //通常為SEM_UNDO,使操作系統跟蹤信號,並在進程沒有釋放該信號量而終止時,操作系統釋放信號量 };
- semctl(sem_id, sem_num, command, semun):控制信號量。commond中有:SETVAL初始化信號量為一個值,該值再semun結構體的val字段;IPC_RMID用於刪除一個無需繼續使用的信號量。
- 信號量的使用實例,同時開兩個進程,每個進程中都用信號量同步臨界區,在臨界區中向屏幕打印字符:
#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include
Linux進程間通信---信號量