Linux共享記憶體的使用 二

2021-08-02 23:23:33 字數 2306 閱讀 1251

訊號量

訊號量是乙個記憶體變數,可以被系統中的任何程序所訪問。
為什麼引入訊號量
大家可以考慮這個問題...

在使用共享記憶體的時候,如果客戶端在讀取資料時,恰好伺服器端也在寫資料,那麼就會出現問題。

如何解決呢?

出現讀寫衝突的問題,可通過訊號量機制,保證讀寫共享記憶體段互斥進行加以解決。

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...