一.共享内存数据结构
对于每个共享内存区,内核维护如下信息结构,定义在<sys/shm.h>, 在ubuntu中路径:/usr/include/linux/shm.h
参数:
key: 这个共享内存段名字
size: 共享内存大小
shmflg:
由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
IPC_RMID 删除共享内存段
shmwrite.c
#include<string.h> #include<stdio.h> #include<stdlib.h> #include<sys/ipc.h> #include<sys/msg.h> #include<sys/types.h> #include<unistd.h> #include<errno.h> #include<fcntl.h> #include<sys/stat.h> #include<sys/mman.h> #include<sys/ipc.h> #include<sys/shm.h> #include<string.h> #define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0) typedef struct stu { char name[32]; int age; } STU; int main(int argc, char *argv[]) { int shmid; shmid = shmget(1234,sizeof(STU),IPC_CREAT | 0666); //用来创建共享内存 if(shmid == -1) ERR_EXIT("shmget err"); STU *p; p = shmat(shmid,NULL,0);//将共享内存段连接到进程地址空间 if(p == (void*)-1) //error (void *) -1 is returned ERR_EXIT("shmat err"); strcpy(p->name,"list"); p->age = 20; while(1) // 等待,接收内存中有quit字符串时,代表读取完成 { if(memcmp(p,"quit",4) == 0)// 需要注意的是,这里比较的是内存 break; } //sleep(10); shmdt(p);//将共享内存段与当前进程脱离 shmctl(shmid,IPC_RMID,NULL); return 0; }
shmread.c
#include<string.h> #include<stdio.h> #include<stdlib.h> #include<sys/ipc.h> #include<sys/msg.h> #include<sys/types.h> #include<unistd.h> #include<errno.h> #include<fcntl.h> #include<sys/stat.h> #include<sys/mman.h> #include<sys/ipc.h> #include<sys/shm.h> #include<string.h> #define ERR_EXIT(m) do { perror(m); exit(EXIT_FAILURE); } while(0) typedef struct stu { char name[32]; int age; } STU; int main(int argc, char *argv[]) { int shmid; shmid = shmget(1234,0,0); //用来创建共享内存 if(shmid == -1) ERR_EXIT("shmget err"); STU *p; p = shmat(shmid,NULL,0);//将共享内存段连接到进程地址空间 if(p == (void*)-1) //error (void *) -1 is returned ERR_EXIT("shmat err"); printf("name=%s age=%d\n",p->name,p->age); memcpy(p,"quit",4); // 读取完数据后,向内存中写入4个字节的数据,代表读取完成 shmdt(p);//将共享内存段与当前进程脱离 return 0; }
原文地址:http://blog.csdn.net/u014304293/article/details/45939015