計數器,記錄可以訪問共享資源的次數。
保護共享資源(硬體裝置,檔案,共享記憶體等等)
訊號量大於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...