分配共享内存
使用shmget函数来分配,首先来看shmget里的参数
使用shmctl函数来释放,下面看看shmctl的参数
输出共享内存指令为 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;}本工程Makefilecli=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
以上便是共享内存的部分知识
新闻热点
疑难解答