1、訊號量介紹
多個程序同時訪問系統上的同一資源時,就需要考慮同步問題,以確保在任一時刻只有乙個程序對資源獨佔式訪問。通常,我們稱訪問共享資源的**為臨界區,程序同步,也就是確保同一時刻,只有乙個程序進入臨界區。
訊號量是實現程序同步的一種方式,訊號量只能取自然數並且只支援兩種操作,即等待和訊號,在linux中稱為p、v操作。比如有sv訊號量,則p、v操作的含義如下:
訊號量可以取任意自然數,但是最常用的訊號量為二進位制訊號量,它只能取0和1,這裡只討論二進位制訊號量。關於訊號量的系統呼叫主要有3個:semget、semop、semctl。此三個函式都是被設計用來操作訊號量集,而不是單個訊號量。
2、semget系統呼叫
#includeint semget(key_t key, int num_sems, int sem_flags)
函式功能為用來建立乙個訊號量集或獲取乙個已經存在的訊號量集,引數資訊如下:
3、semop系統呼叫
#includeint semop(int sem_id, struct sembuf* sem_ops, size_t num_sem_ops)
semop函式用來改變訊號量的值,即執行p、v操作,引數資訊如下:
struct sembuf
sem_num成員指定訊號量集中的訊號量編號,從0開始。sem_op成員指定操作型別,其值可為正整數、0和負整數,訊號量集操作型別較為複雜(可參見apue),這裡就只以二進位制訊號量為例來說明,sem_op為-1時即為p操作,為1時即為v操作。sem_***成員可選值為ipc_nowait和sem_undo,ipc_nowait表示系統呼叫無論是否操作成功,都將立即返回,類似於非阻塞;而sem_undo則表示使核心跟蹤訊號量,如果程序沒有釋放訊號量而異常退出,則由核心來釋放該訊號量值。
4、semctl系統呼叫
#includeint semctl(int sem_id, int sem_num, int command, ...)
semctl函式用於對訊號量進行控制,引數資訊如下:
union semun
command常用的操作有兩種,其一,setval,用來把訊號量初始化為乙個已知值,這個值由union semun中的val成員指定,其作用是在訊號量初次使用前進行設定;其二,ipc_rmid,用於刪除乙個不需要再使用的訊號量集,並喚醒所有等待該訊號量集的程序。
5、使用ipc_private訊號量進行程序間通訊示例
#include#include#include#include#include#define sem_flags 0666
union semun
;void pv(int sem_id, int option) //pv操作,option為-1時為p操作,option為1時為v操作
int main(int argc, char* argv)
else if(id > 0)
else
wait(null);
semctl(sem_id, 0, ipc_rmid, sem_un); //刪除訊號量
return 0;
}
程序間通訊 訊號量
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 ...