分配共享內存
使用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
以上便是共享內存的部分知識
新聞熱點
疑難解答