程序通訊之訊號量

2021-07-25 20:19:53 字數 2668 閱讀 8395

1、訊號和訊號量

–訊號與訊號量是不同的兩種事物。

–訊號量是用來調協程序對共享資源的訪問的。為了防止出現因多個程式同時訪問乙個共享資源而引發的一系列問

題,通過生成並使用令牌來授權,在任一時刻只能有乙個執行執行緒訪問**的臨界區域。臨界區域是指執行資料更新的

**需要獨佔式地執行,而訊號量就可以提供這樣的一種訪問機制,讓乙個臨界區同一時間只有乙個執行緒在訪問它。

2、int semget(key_t key,int nsems,int sem***)

–semget((key_t)1234, 1, 0666 | ipc_creat)

–引數key不相關的程序可以通過它訪問乙個訊號量,只有semget函式才直接使用訊號量鍵,所有其他的訊號量函

數使用由semget函式返回的訊號量識別符號 –

引數num_sems指定需要的訊號量數目,它的值幾乎總是1

–第三個引數sem_flags是一組標誌,許可權+建立(如果不存在則建立,存在則開啟)

–函式執行成功,則返回訊號量集的識別符號(乙個大於等於0的整數),失敗則返回-1。

3、int semop(int semid,struct sembuf *sops,size_t nsops)

–semop(sem_id, &sem_b, 1)pv 操作通過呼叫semop函式來實現

–semid:訊號集的識別碼

–sops:指向儲存訊號操作結構的陣列指標

–nsops:標明了引數sops所指向陣列中的元素個數,恆大於或等於1。

–成功執行時

返回0。失敗返回-1

struct sembuf

;

sem_num:操作訊號在訊號集中的編號,第乙個訊號的編號是0。

sem_op:如果其值為正數,該值會加到現有的訊號內含值中。通常用於釋放所控資源的使用權;如果sem_op的值為

負數,而其絕對值又大於訊號的現值,操作將會阻塞,直到訊號值大於或等於sem_op的絕對值。通常用於獲取資源

的使用權;如果sem_op的值為0,如果沒有設定ipc_nowait,則呼叫該操作的程序或者執行緒將暫時睡眠,直到訊號

量的值為0;否則,程序或者執行緒不會睡眠,函式返回錯誤eagain。

sem_***:訊號操作標誌,可能的選擇有兩種

ipc_nowait //對訊號的操作不能滿足時,semop()不會阻塞,並立即返回,同時設定錯誤資訊。

sem_undo //程式結束時(不論正常或不正常),保證訊號值會被重設為semop()呼叫前的值。這樣做的目的在於避免

程式在異常情況下結束時未將鎖定的資源解鎖,造成該資源永遠鎖定。

nsops:訊號操作結構的數量,恆大於或等於1。

4、int semctl(int semid,int semnum,int cmd, /*union semun arg*/)

semctl(sem_id, 0, setval, sem_union)

–系統呼叫semctl用來執行在訊號量集上的控制操作。這和在訊息佇列中的系統

呼叫msgctl是十分相似的。但這兩          個系統呼叫的引數略有不同。

–semid訊號量集ipc識別符號。

–semnum操作訊號在訊號集中的編號。

–cmd指出要操作的具體命令,setval設定訊號量集中的乙個單獨的訊號量的值,ipc_rmid將訊號量集從記憶體           中刪除。(getval setval getpid getncnt getzcnt getall setall ipc_rmid ipc_set spc_stat )

–sem_union指向核心中使用的資料結構的指標。

–arg代表乙個semun

union semun

例:

#include #include #include #include #include #include #include #include union semun  

;

static int sem_id = 0;

static int set_semvalue();

static void del_semvalue();

static int semaphore_p();

static int semaphore_v();

int main(int argc, char *argv)

//設定要輸出到螢幕中的資訊,即其引數的第乙個字元

message = argv[1][0];

sleep(2);

} for(i = 0; i < 10; ++i)

sleep(10);

printf("\n%d - finished\n", getpid());

if(argc > 1)

exit(exit_success);

}

static int set_semvalue()

static void del_semvalue()

static int semaphore_p()

return 1;

}

static int semaphore_v()

return 1;

}

程序通訊之訊號量

一 訊號量 訊號燈 概念 訊號量提供一種訪問機制,讓乙個臨界區同一時間只有乙個程序在訪問他,也就是說訊號量用來協調程序對共享資源的訪問的。訊號量是乙個特殊的變數,程式對其訪問都是原子操作,只允許對他進行等待 p 和傳送資訊 v 的操作。最簡單的訊號量只能取0和1的變數,這也是訊號量最常見的一種形式,...

程序通訊之訊號量

程序通訊之訊號量 一 引言 我們知道在一條單軌鐵路上,任何時候在上面只能有一列列車行駛在上面。而管理這條鐵路的系統就是訊號量,任何一列列車必須等到表明可以行駛的訊號確認以後才能進入鐵路。當一列列車進入軌道行駛時,需要將軌道改為禁止其他列車進入,從而防止不知情的列車進入軌道,發生衝突。而當列車行駛完這...

程序通訊之訊號量

訊號量 訊號量是乙個計數器,用來表示系統資源的數量,訊號量用於多程序對共享資料物件的訪問,來實現程式的同步互斥。為了正確實現訊號量,訊號量的加減操作必須是原子操作,因此,訊號量也是在核心中實現的。先看一下同步互斥和原子操作 同步互斥 互斥 乙個程序占用資源,其它程序就不能使用該資源,程序間的這種關係...