臨界資源:同一時刻,只能被乙個程序訪問的資源
臨界區:訪問臨界資源的**區
原子操作:任何情況下都不能被打斷的操作
核心物件:對通訊值的記錄,類似管道
訊號量的實質是記錄資源同時能被多少個程序訪問,作用於程序間的同步控制,不同於鎖,它可以有n個有限值。
舉個例子,訊號量類似乙個停車場,而鎖類似停車場中的乙個停車位,當車輛進入停車場時,停車位數量減一,但是在有其它空餘停車位時,車輛依然可以進入停車場。而乙個停車位有車輛時,其它車輛不可以進入這個停車位。
總的來說,訊號量的通訊資訊是資源的可訪問數量,不同於管道的資料。
1. 建立或獲取:int semget((key_t)key, int nsems, int flag);
key是鍵值,是乙個唯一的非零整數,類似於乙個「身份證號」,其它程序通過這個「身份證號」來使用這組訊號量;
nsems 用來確定核心建立的訊號量陣列大小;
flag 用來確定操作和許可權,可以通過與上pc_creat在不存在該訊號量時建立,存在時獲取;
返回值:非零的訊號量識別符號,其它函式根據訊號量識別符號來操作,而非鍵值;
栗子:int sem_id = semget( (key_t)1234, 1, 0666|ipc_creat );
2. p/v操作:int semop( int semid , struct sembuf * buf , int lenth);
semid: semget返回的訊號量識別符號
struct sembuf * buf:乙個結構體
struct sembuf
;
3. 初始化和刪除:int semctl(int sem_id, int sem_num, int command, uniousemun);semid: semget返回的訊號量識別符號
sem_num:訊號量陣列的下標,如果只有乙個元素,則為零
command:操作,setval為初始化,ipc_rmid為刪除
uniou semun:在初始化時,需要用到
unionsemun
;
需要注意的是,在多個程序之間使用訊號量通訊,可以將p操作之後的**認為是臨界區,即p操作不是簡單的減一,而是要理解為:如果能做p操作之後臨界區的事件,那麼減一,否則等待
sem.h 為標頭檔案
sem.c 將訊號量操作進行了簡單的封裝
maina.c和mainb.c是乙個簡單的示例:
maina讀取鍵盤輸入,直到輸入ok,mainb列印100以內的素數
#ifndef _sem_h
#define _sem_h
#include
#include
#include
#include
#include
#include
#include
#include
int semid;
union semun
;void sem_get(int key,int len,int val);
void sem_p();
void sem_v();
void sem_del();
#endif
#include "sem.h"
void sem_get(int key,int len,int val)
}}void sem_p()
}void sem_v()
}void sem_del()
}
#include "sem.h"
int main()
; fgets(buff,127,stdin);
if(strncmp(buff,"ok",2)==0)
}sem_del();
return
0;}
#include "sem.h"
void prime()
if(j>=i)
printf("%d\n",i);
}}int main()
程序間通訊 訊號量
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 ...