訊號量
訊號量是乙個記憶體變數,可以被系統中的任何程序所訪問。
為什麼引入訊號量大家可以考慮這個問題...
在使用共享記憶體的時候,如果客戶端在讀取資料時,恰好伺服器端也在寫資料,那麼就會出現問題。
如何解決呢?
出現讀寫衝突的問題,可通過訊號量機制,保證讀寫共享記憶體段互斥進行加以解決。
linux中的訊號量linux中訊號量是以集合的形式存在的,乙個集合中存在著多個訊號量。
訊號量的操作函式功能 建立乙個訊號量集合
標頭檔案 #include
函式原型
intsemget(key_t key, int nsems, int flag);
key 建立訊號量集的鍵值
nsems 集合中訊號量的個數
flag 訊號量集的許可權
返回值 >0 訊號量集的id
-1 失敗
功能 操作訊號量集合
標頭檔案 #include
函式原型
int semctl(int semid, int semnum, int cmd, union semun arg);
semid 訊號量集id
semnum 要操作的訊號量序號
cmd 要執行的命令
ipc_stat 取訊號量集的屬性,存放在arg.buf所指單元
ipc_set 按arg.buf所指單元的資料設定訊號量集合中的
sem_perm.uid、sem_perm.gid、sem_perm.mode
三個屬性。
ipc_rmid 刪除該訊號量集合
getval 返回第semnum個訊號量的semval值
setval 用arg.val設定第semnum個訊號量的semval值
getall 取訊號量集所有訊號量的值,存放在arg.array指向的
陣列中
setall 按照arg.array所指陣列的值設定訊號量集中所有訊號
量的值arg 修改訊號量時所需的資料或獲取訊號量資料時所需的變
量(可選)
返回值 與cmd相關
功能 完成訊號量集的一組操作
標頭檔案 #include
函式原型
int semop(int semid, struct sembuf semoparr, size_t
nops);
semid 訊號量集id
semoparr 存放一組訊號量操作的陣列
nops 陣列中操作的數量
返回值 0 成功
-1 失敗
我們直接在上篇的基礎上,對伺服器的**進行一些修改,客戶端**不變
//伺服器端**
#include
#include
#include
#include
#include
#include
#include
#define shm_key 99
#define sem_key 88
int init_sem(int semid,int semnum,int val)initval;
initval.val=val;
if(semctl(semid,semnum,setval,initval)==-1)
}void lockforwrite(int semid)
}void unlockafterwrite(int semid)
}int main()
mem_ptr=(char *)shmat(seg_id,0,0);
if(mem_ptr==null)
//(1)建立訊號量集
if((sem_id=semget(sem_key,2,ipc_creat|0770))==-1)
//(2)對訊號量進行初始化
init_sem(sem_id, 0, 0);
init_sem(sem_id, 1, +1);
while(i>0)
shmctl(seg_id,ipc_rmid,null);
return
0;}
linux共享記憶體的使用
linux共享記憶體和windows的共享記憶體邏輯上有很大區別,要注意一下幾點 標識描述 ipc excl 這個加入後,如果已經存在標識為key的共享記憶體則報錯返回 1 0如果是0 的話,就可以實現,如果共享記憶體不存在則返回失敗 1,否則直接建立返回成功 0666 這個識別符號很多人不知道啥意...
Linux 使用共享記憶體
1.共享記憶體與訊息佇列的區別 訊息佇列在實現訊息的收發時,首先由傳送程序從程序空間將資料複製到核心分配的資料緩衝區中,接受程序再從核心的緩衝區複製到程序的虛擬位址空間 共享記憶體是將核心分配的共享儲存區域對映到程序的位址空間實現的,沒有資料的複製過程,共享記憶體的訪問速度要比訊息佇列快 2.共享記...
linux共享記憶體使用例項
三個檔案,乙個標頭檔案,乙個讀,乙個寫,用同乙個key值申請共享記憶體。shm.h ifndef shm com h define shm com h 1 define text sz 2048 struct shared use at struct kts endif shm write.c in...