Linux訊號量詳解

2021-09-08 15:02:49 字數 1862 閱讀 6975

1.什麼是訊號量

訊號量是一種特殊的變數,訪問具有原子性。

只允許對它進行兩個操作:

1)等待訊號量

當訊號量值為0時,程式等待;當訊號量值大於0時,訊號量減1,程式繼續執行。

2)傳送訊號量

將訊號量值加1。

我們使用訊號量,來解決程序或執行緒間共享資源引發的同步問題。

2.linux中訊號量的使用

linux提供了一組訊號量api,宣告在標頭檔案sys/sem.h中。

1)semget函式:新建訊號量

int semget(key_t key,int num_sems,int sem_flags);
key:訊號量鍵值,可以理解為訊號量的唯一性標記。

num_sems:訊號量的數目,一般為1

sem_flags:有兩個值,ipc_create和ipc_excl,

ipc_create表示若訊號量已存在,返回該訊號量識別符號。

ipc_excl表示若訊號量已存在,返回錯誤。

返回值:相應的訊號量識別符號,失敗返回-1

2)semop函式:修改訊號量的值

int semop(int sem_id,struct sembuf *sem_opa,size_t num_sem_ops);
sem_id:訊號量識別符號

sem_opa:結構如下

struct

sembuf;

3)semctl函式:用於訊號量的初始化和刪除

int semctl(int sem_id,int sem_num,int command,[union semun sem_union]);
command:有兩個值setval,ipc_rmid,分別表示初始化和刪除訊號量。

sem_union:可選引數,結構如下:

union semun;
一般用到的是val,表示要傳給訊號量的初始值。

3.linux訊號量使用示例

下例中,我們寫了乙個程式,程式中有乙個char型別的字元,char message='x'

然後同時執行這個程式的兩個例項。

第乙個例項,帶乙個引數,將引數的第乙個字元賦給message,比如為'0'

第二個例項,使用預設message值'x'

我們的目的是,使用訊號量,迴圈執行這兩個例項,

我們可以看到執行結果應該是'x0x0x0x0x0x0'

#include#include

#include

union semun

;int

sem_id;

intset_semvalue()

intsemaphore_p()

return1;

}int

semaphore_v()

return1;

}void

del_semvalue()

int main(int argc,char *ar**)

//引數的第乙個字元賦給message

message = ar**[1][0

]; }

int i=0

;

for(i=0;i<5;i++)

printf(

"\n%d-finished\n

",getpid());

if(argc>1

)

exit(exit_success);

}

輸出結果:

Linux訊號量詳解

1.什麼是訊號量 訊號量是一種特殊的變數,訪問具有原子性。只允許對它進行兩個操作 1 等待訊號量 當訊號量值為0時,程式等待 當訊號量值大於0時,訊號量減1,程式繼續執行。2 傳送訊號量 將訊號量值加1。我們使用訊號量,來解決程序或執行緒間共享資源引發的同步問題。2.linux中訊號量的使用 lin...

linux下訊號量詳解

訊號量 訊號量實際上就是乙個計數器,用於控制程序或執行緒對臨界資源的同步與互斥,對訊號量的操作是乙個原子操作 也就是在乙個程序或執行緒訪問它時,其它的程序或執行緒不能同時訪問它來打斷前乙個程序或執行緒的操作 它的原理就是在乙個程序或執行緒過來時,先訪問訊號量,如果這個訊號量大於0,則讓計數 1,然後...

Linux 訊號量使用例項詳解

例項篇 1.定義帶有裝置併發控制方案的結構體 諸如訊號量,自旋鎖等,反正前邊那麼多了 struct csyncontrol dev 然後,將訊號量的初始化工作放到模組初始化部分裡 int csycontrol init void 以後在訪問csyncontrol dev中的共享資源時,需要首先獲取這...