程序間通訊 訊號量

2021-06-22 10:34:45 字數 2275 閱讀 9547

訊號量不是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,則...