程序間通訊 訊號量

2021-08-02 10:09:21 字數 2891 閱讀 5477

(1)訊號量的基本概念:

訊號量的本質是一種資料操作鎖,它的本身不具有資料交換的功能,而是通過控制其他的通訊資源(檔案,外部裝置)來實現程序間通訊,它本身只是一種外部資源的標識。訊號在此過程中負責資料操作的互斥,同步等功能。

當請求乙個訊號量來表示的資源時,程序需要先讀取訊號量的值來判斷資源是否可用。如果大於0,表示資源可以用,等於0表示沒有可用資源,這個時候程序會進入睡眠狀態直至有資源可用。

當程序不再使用乙個訊號量來控制共享資源時,訊號量的值加1,對訊號量的值進行的增減操作均屬於原子操作,這個因為訊號量主要的作用是維護資源的互斥或多程序的同步訪問。

注意:1,乙個訊號量的生命週期是隨核心的。2,訊號量必須能夠被其他的程序看到。3,檢視訊號量的命令:ipcs  -s。

(2)訊號量的使用:

由於訊號量只能進行兩種操作,分別是等待訊號和傳送訊號,即p(sv)和v(sv)。

p(sv):如果sv的值大於0,就減一,如果它等於零表示該程序掛起(程序的掛起本身就是pcb的掛起)

v(sv):如果其他程序因為等待sv而被掛起,就讓他恢復執行,如果沒有程序因等待sv而被掛起,就給他加一。

(3)建立訊號量:

key:唯一非零的整數,其他的程序可以通過key值來訪問這個訊號量,它代表程式可能使用的某個資源,程式對所有訊號量的訪問都是間接的。程式先通過呼叫segment函式並提供乙個建,再由系統生成乙個相應的訊號識別符號。只有segment函式才直接呼叫訊號量鍵。

nsems:指定需要的訊號量數目。

sem***:ipc_creat   ipc_excl,如果只是單獨使用ipc_creat則表示,如果這個有這個訊號量,那麼便使用這個訊號量,如果這個訊號量沒有那麼就建立乙個。如果兩個都是用,那麼表示,如果這個訊號量沒有,則建立乙個,如果有就會報錯。

(4)改變訊號量的值:

semid:semget函式返回的訊號量識別符號。

unsigned short sem_num:一般為0,除非有其他的訊號量

short sem_op:由p操作和v操作返回的值,分別為+1,-1

short sem_***:一般是sem_undo

sem_undo用於將修改的訊號量值在程序正常退出或異常退出時歸還給訊號量

nsops:設定的訊號量值

(5)控制訊號量:

semid:semget函式返回的訊號量識別符號

sennum:設定訊號量的值

cmd:它有四種值:ipc_stat,ipc_set,ipc_rmid,ipc_info

如果有第四個引數,那就是:

union semun ;
(6)現在我們使用上面的函式來用訊號量實現程序之間的通訊:

1 #ifndef _comm_h_

2 #define _comm_h_

3 #include4 #include5 #include6 #include7 #include8 #include9 #define pathname "."

10 #define proj_id 6666

11 12 union semno

13 ;

19 20 int createsemset(int nums);

21 int getsemget();

22 int initsemset(int semid,int num);

23 int p(int semid);

24 int v(int semid);

25 int destoryset(int semid);

26 #endif

1 #include"comm.h"

2 3 int commsemset(int flags,int nums)

4 12 int semid=semget(_key,nums,flags);

13 if(semid<0)

14

19 return semid;

20 }

21 int createsemset(int nums)

22 25 int getsemset()

26 29 int initsemset(int semid,int nums)

30 39 return 0;

40 }

41 int commpv(int semid,int nums,int flags)

42 52 return 0;

53 }

54 int p(int semid)

55 58 int v(int semid)

59 62 int destorysemset(int semid)

63 

70 return 0;

71 72 }

73 74 int main()

75

93 }

94  else

95

107 }

108 }

109

其執行結果為:

程序間通訊 訊號量

ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...

程序間通訊 訊號量

system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...

程序間通訊 訊號量

訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...