上文說共享記憶體的缺點可以嘗試訊號量彌補
多執行緒訊號量是posix訊號量,程序間通訊是system v訊號量
posix sem 實現是基於futex的。 在無競爭條件下,不需要陷入核心,執行系統呼叫,其實現是非常輕量級的。
system v sem 則不同,無論有無競爭都要執行系統呼叫,因此效能落了下風。
標頭檔案:
#include
#include
#include
int semget(key_t key, int nsems, int sem***);
該函式執行成功返回訊號量標示符,失敗則返回-1。 引數key是函式通過呼叫ftok函式得到的鍵值,nsems代表建立訊號量的個數,如果只是訪問而不建立則可以指定該引數為0 ;但一旦建立了該訊號量,就不能更改其訊號量個數。 只要不刪除該訊號量,就可以重新呼叫該函式建立該鍵值的訊號量,該函式只是返回以前建立的值,而不會重新建立。 semfig指定該訊號茸的讀寫許可權,
int semop(int semid, struct sembuf *sops, unsigned nsops);
struct sembuf
int semctl (int semid, int semnum, int cmd, … ) ;
如果有第4個引數,它通常是乙個unionsemum結構,定義如下:
union semun
cmd通常是setval或ipc rmid。 setval用來把訊號量初始化為乙個己知的值。 p值通過unionsemun中的val成員設定,其作用是在訊號量第一次使用前對它進行設定。 ipc_rmid用於刪除乙個已經無須繼續使用的訊號量識別符號。
訊號量+共享記憶體關鍵步驟:
int semid,shmid;
shmid =
shmget
(shm_key,
sizeof
(int),ipc_creat|
0666);
void
* shmptr;
shmptr =
shmat
(shmid,
null,0
);int* data=
(int
*)shmptr;
semid =
semget
(sem_key,
2, ipc_creatl0666) ;/*這裡是建立乙個semid,並且有兩個訊號量*/
union semun semunl;/*下面這四行就是初始化那兩個訊號量,乙個val=o,另乙個val=l*
/sernunl.val=o;
sernctl
(sernid,
0,setval,sernunl)
; sernunl.val=l;
sernctl
(sernid,
1,setval,sernunl)
;struct sernbuf sernbufl
//讀while
(l)///寫
while
(l)
如上 程序間通訊 訊號量
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 ...