訊號量不是ipc
機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別:二元訊號:值為0或
1,1說明有可用資源,
0說明此時資源占用,其他程序需等待。計數訊號量:表示可用資源數量。計數訊號量集:由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。
訊號量資料結構:
#include struct semid_ds // 訊號量描述符;
#include struct ipc_perm //許可權設定結構體
; struct sem
訊號的建立和操作:
#include
#incldue
#include
int semget (key_t key , int nsems , int flag)
獲取乙個訊號量集,key是乙個鍵值由
ftok
獲得,nsems
:訊號量集合中訊號個數,flag
讀寫標誌位。
int semop(int semid , struct sembuf *opsptr , size_t nops)
對建立好的訊號量集操作,引數struct sembuf ;
opsptr指向陣列的每乙個
sembuf
表示乙個特定訊號量的操作,
nops
標誌指向陣列大小。
當sem_op
為正時,程序釋放占用資源,
sem_op
值加到訊號量值。
當sem_op
為負,獲取該訊號量控制資源,在訊號量值小於
sem_op
絕對值(資源不滿足要求),則:若指定
ipc_nowait
,則semop
出錯返回
eagain
。若未指定
ipc_nowait
呼叫程序進入休眠狀態,直到:某些程序釋放資源;系統刪除該訊號量;程序捕捉乙個訊號。
當semop為0
,表示呼叫程序希望等到該訊號量值變為
0,訊號量值是
0立即返回,非
0時,若指定
ipc_nowait
,則出錯返回,若未指定程序休眠情況同上。
int semctl (int semid , int semnum , int cmd, ....../*union semun arg*/)
實現對訊號量各種控制操作,semid
:要進行操作的訊號量集,
senum
:訊號集中的某個訊號量可取為
getval
,setval
,getncnt
,getpid
。最後乙個引數可選取決於第三個引數
cmd,
union senum {
int val ; // for setval
struct semid_ds *buf ; //for ipc_set and ipc_stat
ushort *array //for getall and setall
cmd取值,在
semid
指定訊號集合執行此命令,
ipc_stat:取訊號集的
semid_ds
結構,並存放
arg.buf
結構。
ipc_set:按照
arg.buf
指向結構中的值,設定此訊號集的三個字段,即
sem_perm
結構體的
uid,
gid,
mode。
ipc_rmid:從系統中刪除該訊號量集合。
getval:返回成員
semnum
的semval值。
setval:設定
semnum
的semval
值,該值由
arg.val
指定。
getpid:返回
semnum
的sempid.
getncnt:返回
semnum
的semncnt
值getzcnt:返回
semnum
的semzcnt值
getall:取訊號所有值放入
array中。
setall:按照
array
每乙個值設定集合中的每個訊號量的值。
程序間通訊 訊號量
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機構 管道 fifo以及訊息列隊 不同。它是乙個計數器,用於多程序對共享資料物件的訪問。為了獲得共享資源,程序需要執行下列操作 1 測試控制該資源的訊號量。2 若此訊號量的值為正,則程序可以使用該資源。程序將訊號量值減1,表示它使用了乙個資源單位。3 若此訊號量的值為0,則...