訊號量是什麼?
(1)訊號量本質上是乙個具有原子性的計數器,用來描述臨界資源的,不能用全域性變數count加加減減替換(因為他沒有原子性)。
(2)訊號量以保護臨界資源為目的,但他本身也是個臨界資源;他控制多個程序對共享資源的訪問,通常描述臨界資源當中,臨界資源的數量,常常被當做鎖來使用,防止乙個程序訪問另外乙個程序正在使用的資源
(3)其中最簡單的訊號量=1,也叫做二元訊號量(互斥鎖),可控制單個資源,只能取0和1;訊號量》=2為多元訊號量
只要理理解上面三句話,應該結合**理解就不難了。
#include
#include
key_t ftok
(const
char
* pathname,
int id)
//pathname:路徑名 id:專案id,非0整數(只有低8位有效)
函式
intsemget
(key_t key,
int nsems,
int sem***)
;//引數:key-->訊號集的名字
//nsems:訊號集中訊號量的個數
//sem***:由九個許可權構成,用法和建立檔案時使用的mode模式一樣
//返回值:成功返回乙個非負整數,即該訊號集的標識碼;失敗返回-1
建立成功後,linux下通過ipcs -s可以檢視已經建立的訊號量情況,刪除使用刪除:ipcrm -s semid
//semctl函式
intsemctl
(int semid,
int semnum,
int cmd,..
.);//引數:
//semid:mesget返回的訊號集標識碼
//semnum:訊號集中訊號量的序號
//cmd:將要採取的動作(有三個取值,一般用於銷毀)
//最後乙個引數根據命令不同而不同
//返回值:成功返回0;失敗返回-1
**實測;
我們用兩個程序分別對乙個檔案進行讀寫:
1.sem.h
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
union semun
;void
sem_init()
;//初始化
void
sem_p()
;//p操作 +1
void
sem_v()
;//v操作 -1
void
sem_destroy()
;//銷毀
2.sem.cpp
#include
"sem.h"
static
int semid =0;
void
sem_init()
}else}}
void
sem_p()
}void
sem_v()
}void
sem_destroy()
printf
("sem destory success!\n");
}
3.proa.cpp
#include
"sem.h"
#include
using
namespace std;
void
file_write
(int x)
;int
main()
sleep(2
);destory_sem()
;//由程序a來銷毀這個訊號量jin
return0;
}void
file_write
(int x)
4.prob.cpp
#include
"sem.h"
#include
using
namespace std;
void
file_write
(int x)
;int
main()
return0;
}void
file_write
(int x)
測試結果: 程序間通訊(4) 訊號量
之前我們學習了管道,訊息佇列,共享記憶體,今天我們再來學一種程序間通訊的方式 訊號量 訊號量 兩個程序看到的同乙個公共的資源,但是同時只能被乙個程序所使用的的資源叫做臨界資源 互斥資源 在晉城中涉及到互斥資源的程式段叫臨界區 互斥 各個程序都要訪問共享資源,但共享資源是互斥的,同時只能有乙個程序使用...
程序間通訊(訊號量通訊)
當我們在實際程式設計時會發現,有時候多個程序或執行緒共用一段 我們要確保某個時刻只有乙個程序或執行緒對這段 進行訪問。為了防止多個程式同時訪問乙個共享資源引發問題,可以用訊號量控制臨界區域的訪問。訊號量分為以下三種 system v訊號量,在核心中維護,可用於程序或執行緒間的同步,常用於程序的同步。...
Linux程序通訊 訊號量
主要用於程序對共享資源的互斥訪問。為了取得對乙個共享資源,程序測試訊號量的值,如果為正,表示還有資源可以訪問,該程序對訊號量加減一。如果為0表示沒有資源可以用,該程序應當休眠等待訊號量的值再次為正。linux中的訊號量使用起來是比較麻煩的。在這裡,訊號量是以集合形式存在的,建立時要給出訊號量的數目,...