linux 之 system v 訊號量

2021-10-10 06:20:24 字數 1903 閱讀 2748

計數器,記錄可以訪問共享資源的次數。

保護共享資源(硬體裝置,檔案,共享記憶體等等)

訊號量大於0,則可以訪問;訊號量等於0,則不可以訪問。

訪問時會將訊號量減1,訪問完成會將訊號量加1。(加1減1可由使用者控制),訊號量減小到0之後,程序就不能去訪問共享資源了。

int

semget

(key_t key,

int nsems,

int sem***)

;

返回值:

成功:訊號量 id

失敗:-1

函式原型:

int

semctl

(int semid,

int semnum,

int cmd,

union semun arg)

;

arg:

union semun

int

semop

(int semid,

struct sembuf *sops,size_t nsops)

;

struct sembuf

;

測試**:

test.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

union semun

;//初始化訊號量

intinit_sem

(int sem_id,

int init_value)

return0;

}//刪除訊號量

intdel_sem

(int sem_id)

}// p 操作

intsem_p

(int sem_id)

return0;

}// v 操作

intsem_v

(int sem_id)

return0;

}#define delay_time 3

intmain

(void

)elseif(

0== result)

//子程序

else

//父程序

exit(0

);}

編譯與執行:

jl@jl-virtual-machine:~/test/11_4$ gcc test.c 

jl@jl-virtual-machine:~/test/11_4$

jl@jl-virtual-machine:~/test/11_4$

jl@jl-virtual-machine:~/test/11_4$

jl@jl-virtual-machine:~/test/11_4$ ./a.out

child process will wait

for some seconds ...

the child process is running ...

the father process is running ...

jl@jl-virtual-machine:~/test/11_4$

jl@jl-virtual-machine:~/test/11_4$

jl@jl-virtual-machine:~/test/11_4$

可以看到,父程序總是在子程序後面執行。

linux之System V共享記憶體

共享記憶體與其他程序通訊方式相比較,不需要複製資料,直接讀寫記憶體,是一種效率非常高的程序通訊方案。但它本身不提供同步訪問機制,需要我們自己控制。在linux中,只要把共享記憶體段連線到程序的位址空間中,這個程序就可以訪問共享記憶體中的位址了。linux系統提供的共享記憶體操作函式與訊號量 訊息佇列...

systemV訊號量 與 Posix訊號量

一 函式上的區別 訊號量有兩種實現 傳統的system v訊號量和新的posix訊號量。它們所提供的函式很容易被區分 對於所有system v訊號量函式,在它們的名字裡面沒有下劃線。例如,應該是semget 而不是sem get 然而,所有的的posix訊號量函式都有乙個下劃線。下面列出了它們提供的...

systemV訊號量的使用案例

systemv訊號量處理的函式有 semget semctl semop include intsemget key t key int nsems,int sem 說明 解釋功能 建立乙個新的訊號量或獲取乙個已經存在的訊號量的鍵值。返回值成功返回訊號量的標識碼id 失敗返回 1。引數 解釋 key...