訊號量 --- 程序間或執行緒間同步
講的是system v裡面的訊號量
二值訊號量 只有0和1兩個值
1 0計數訊號量 有n個值
4 3 2 1 0
圖書館借書~
借出書 : n-1 ------ 程序申請訊號量 p操作
歸還書: n+1
------ 程序釋放訊號量 v操作
p 操作
v 操作
等0操作 --- 書都被借完了
system v 訊號量概念是指乙個訊號量集合,包含乙個或多個訊號量,
但是使用時候,可以設定成這個集合裡面只有乙個訊號量
sem建立訊號量
semid = semget (key_t , nsems(1) , 0666 | ipc_creat );
訊號量操作
semop( semid , struct sembuf指標 , nops(操作的個數) )
short sem_num semaphore number. 要操作的訊號量編號
short sem_op semaphore operation. 對應操作 p操作 ? v 操作?
short sem_*** operation flags. 0 ? ipc_nowait ? sem_undo
控制訊號量
union semun // 該聯合體結構需要自己定義
;union semun sem_union;
初始化: semctl(semid , 編號 , setval, sem_union)
銷毀: semctl(semid , 編號,ipc_rmid, sem_union);
訊號量值為0 :
當前沒有資源可以用,如果a程序在做p操作,那就會阻塞;
直到有其它程序釋放該資源,也就v操作
操作已經del的訊號量,會報錯,如v operation: invalid argument
兩個程序,乙個負責從檔案裡面讀,乙個負責寫
怎麼用訊號量來實現同步: 寫的時候不能讀,讀的時候也不能寫
int semid_w = semget((key_t)1234 , 1 , 0666|ipc_creat)
int semid_r = semget((key_t)2345 , 1 , 0666|ipc_creat)
init_sem( semid_w , 1);
init_sem( semid_r , 0);
寫:sem_p(semid_w)
write()
sem_v(semid_r);
讀: sem_p(semid_r)
read();
sem_v(semid_w)
system v ipc中的key_t值
key_t key_val = ftok(pathname ,'a')
proj_id + inode 低16位, + device的低8位 --- 就組成了乙個 key_t
和(key_t)1234相比,更加獨特不容易重複
例項:
#include #include #include #include #include #include #include #include // ./io_sem a & ./io_sem b
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 *ar**)
//設定要輸出到螢幕中的資訊,即其引數的第乙個字元
message = ar**[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;
}
參考:
Linux程序通訊 訊號量
主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為0表示沒有資源可以用,該程序應當休眠等待訊號量的值再次為正。linux中的訊號量使用起來是比較麻煩的。在這裡,訊號量是以集合形式存在的,建立時要給出訊號量的數目,...
Linux程序通訊 訊號量
訊號量是乙個核心變數,它可以被系統中的任何程序所訪問。程序間可以使用這個變數來協調對於共享記憶體和其他資源的訪問。如果不刪除訊號量,它將繼續在系統中存在,即使程式已經退出,它可能在你下次執行此程式時引發問題,而且訊號量是一種有限的資源。簡單的例子 父程序與子程序共享印表機,必須其中一者列印完後,另一...
Linux 程序通訊 訊號量
基本概念 訊號量和p,v 原語 訊號量 訊號量值的含義 訊號量結構偽 訊號量的本質是乙個計數器 struct semaphore p原語 p s v原語 v s 訊號量有關函式 建立或開啟訊號量 設定初值 銷毀訊號量 union semun union senun su su.val 1 檢視訊號量...