国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【linux】共享內存

2019-11-08 02:45:20
字體:
來源:轉載
供稿:網友

分配共享內存

使用shmget函數來分配,首先來看shmget里的參數

該函數的第一個參數是一個用來標識共享內存塊的鍵值。彼此無關的進程可以通過指定同一個鍵以獲取對同一個共享內存塊的訪問。不幸的是,其它程序也可能挑選了同樣的特定值作為自己分配共享內存的鍵值,從而產生沖突。用特殊常量ipC_PRIVATE作為鍵值可以保證系統建立一個全新的共享內存塊。該函數的第二個參數指定了所申請的內存塊的大小。因為這些內存塊是以頁面為單位進行分配的,實際分配的內存塊大小將被擴大到頁面大小的整數倍。第三個參數是一組標志,通過特定常量的按位或操作來shmget。這些特定常量包括:IPC_CREAT:這個標志表示應創建一個新的共享內存塊。通過指定這個標志,我們可以創建一個具有指定鍵值的新共享內存塊。IPC_EXCL:這個標志只能與 IPC_CREAT 同時使用。當指定這個標志的時候,如果已有一個具有這個鍵值的共享內存塊存在,則shmget會調用失敗。也就是說,這個標志將使線程獲得一個“獨有”的共享內存塊。如果沒有指定這個標志而系統中存在一個具有相同鍵值的共享內存塊,shmget會返回這個已經建立的共享內存塊,而不是重新創建一個。釋放共享內存

使用shmctl函數來釋放,下面看看shmctl的參數

該函數的第一個參數是一個共享內存塊標識。要獲取一個共享內存塊的相關信息,則為該函數傳遞 IPC_STAT 作為第二個參數,同時傳遞一個指向一個 struct shmid_ds 對象的指針作為第三個參數。要刪除一個共享內存塊,則應將 IPC_RMID 作為第二個參數,而將 NULL 作為第三個參數。當最后一個綁定該共享內存塊的進程與其脫離時,該共享內存塊將被刪除。您應當在結束使用每個共享內存塊的時候都使用 shmctl 進行釋放,以防止超過系統所允許的共享內存塊的總數限制。調用 exit 和 exec 會使進程脫離共享內存塊,但不會刪除這個內存塊。查看系統中共享內存的指令為ipcs -m

輸出共享內存指令為 ipcrm -m 共享內存的id,這里就不再做演示了

下面用代碼來實現共享內存的測試

shm.c

#ifndef _SHM_#define _SHM_#include<stdio.h>#include<unistd.h>#include<sys/ipc.h>#include<sys/shm.h>#include<string.h>#include<sys/wait.h>#define PATHTYPE "."#define PROJID 88#define SIZE 4096*1int creatShm();int getShm();char* atShm(int shmId);int dtShm(char*addr);int destoryShm(int shmId);#endifshm.c

#include"shm.h"static int commShm(int flg){    key_t k=ftok(PATHTYPE,PROJID);	if(k<0){		perror("ftok");		return -1;	}	int semId=shmget(k,SIZE,flg);	if(semId<0)	{	perror("shmget");	return -2;	//printf("get share memory error!/n");	}	//else	//{	//	printf("get share memory success!/n");	//}		return semId;}int creatShm(){ return commShm(IPC_CREAT|IPC_EXCL);}int getShm(){	return commShm(IPC_CREAT);}char* atShm(int shmId){return (char*)shmat(shmId,NULL,0);}int dtShm(char*addr){	return shmdt(addr);}int destoryShm(int shmId){	if(shmctl(shmId,IPC_RMID,NULL)<0)	{		perror("shmctl");		return -1;	}	return 0;}上面的代碼是生成共享內存的代碼

以下是發送方代碼client.c

#include"shm.h" 
int main(){	int shmid=creatShm();    char*mem=	shmat(shmid,NULL,0);	while(1)	{		sleep(1);		printf("%s/n",mem);	}	shmdt(mem);	destoryShm(shmid);	return 0;}以下是接收方server.c

#include"shm.h"int main(){	int shmid=creatShm();    char*mem=	shmat(shmid,NULL,0);	while(1)	{		sleep(1);		printf("%s/n",mem);	}	shmdt(mem);	destoryShm(shmid);	return 0;}本工程Makefile

cli=clientser=servercc=gccserSrc=shm.c server.ccliSrc=shm.c client.c.PHONY:allall:$(cli) $(ser)$(cli):$(cliSrc)	$(cc) -o $@ $^$(ser):$(serSrc)	$(cc) -o $@ $^.PHONY:cleanclean:	rm -f $(cli) $(ser)測試結果

下面進行監控查看共享內存信息

我們發現這個共享內存的shmid為shmid,掛載了兩個進程nattch為2

以上便是共享內存的部分知識


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 修水县| 将乐县| 鄂州市| 伊川县| 长兴县| 宁城县| 昌吉市| 闵行区| 射阳县| 滁州市| 河西区| 昌图县| 丽江市| 临邑县| 余姚市| 天水市| 蒙自县| 肇州县| 金乡县| 双城市| 五华县| 廉江市| 新兴县| 西充县| 临沂市| 德钦县| 德令哈市| 田东县| 日土县| 淮安市| 汾西县| 同仁县| 中牟县| 聂荣县| 鞍山市| 宜宾市| 新田县| 武乡县| 新沂市| 武山县| 闵行区|