linux程序通訊 訊號量

2021-09-30 12:23:12 字數 2351 閱讀 8926

訊號量 --- 程序間或執行緒間同步

講的是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 檢視訊號量...