免费建站平台0,做app价格,好的公司网站有什么用,济南道驰网站建设有限公司怎么样共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法#xff0c;一个进程向共享内存区域写入了数据#xff0c;共享这个内存区域的所有进程就可以立刻看到其中的内容。原理图如下#xff1a; 共享内存的实现分为两个步骤#xff1a; 一、… 共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法一个进程向共享内存区域写入了数据共享这个内存区域的所有进程就可以立刻看到其中的内容。原理图如下 共享内存的实现分为两个步骤 一、 创建共享内存使用shmget函数。 二、 映射共享内存将这段创建的共享内存映射到具体的进程空间去使用shmat函数。 创建共享内存 int shmget(key_t key ,int size,int shmflg) key标识共享内存的键值0/IPC_PRIVATE。当key的取值为IPC_PRIVATE,则函数shmget将创建一块新的共享内存如果key的取值为0而参数中又设置了IPC_PRIVATE这个标志则同样会创建一块新的共享内存。 返回值如果成功返回共享内存表示符如果失败返回-1。 映射共享内存 int shmat(int shmid,char *shmaddrint flag) 参数 shmid:shmget函数返回的共享存储标识符 flag决定以什么样的方式来确定映射的地址(通常为0) 返回值 如果成功则返回共享内存映射到进程中的地址如果失败则返回-1。 共享内存解除映射 当一个进程不再需要共享内存时需要把它从进程地址空间中多里。 int shmdt(char *shmaddr) 贡献内存实例如下 实验要求创建两个进程在A进程中创建一个共享内存并向其写入数据通过B进程从共享内存中读取数据。 chm_com.h函数 [cpp] view plaincopy #define TEXT_SZ 2048 struct shared_use_st { int written_by_you; char some_text[TEXT_SZ]; }; 读取进程 [cpp] view plaincopy /********************************************************** *实验要求 创建两个进程通过共享内存进行通讯。 *功能描述 本程序申请和分配共享内存然后轮训并读取共享中的数据直至 * 读到“end”。 *日 期 2010-9-17 *作 者 国嵌 **********************************************************/ #include unistd.h #include stdlib.h #include stdio.h #include string.h #include sys/types.h #include sys/ipc.h #include sys/shm.h #include shm_com.h /* * 程序入口 * */ int main(void) { int running1; void *shared_memory(void *)0; struct shared_use_st *shared_stuff; int shmid; /*创建共享内存*/ shmidshmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT); if(shmid-1) { fprintf(stderr,shmget failed\n); exit(EXIT_FAILURE); } /*映射共享内存*/ shared_memoryshmat(shmid,(void *)0,0); if(shared_memory(void *)-1) { fprintf(stderr,shmat failed\n); exit(EXIT_FAILURE); } printf(Memory attached at %X\n,(int)shared_memory); /*让结构体指针指向这块共享内存*/ shared_stuff(struct shared_use_st *)shared_memory; /*控制读写顺序*/ shared_stuff-written_by_you0; /*循环的从共享内存中读数据直到读到“end”为止*/ while(running) { if(shared_stuff-written_by_you) { printf(You wrote:%s,shared_stuff-some_text); sleep(1); //读进程睡一秒同时会导致写进程睡一秒这样做到读了之后再写 shared_stuff-written_by_you0; if(strncmp(shared_stuff-some_text,end,3)0) { running0; //结束循环 } } } /*删除共享内存*/ if(shmdt(shared_memory)-1) { fprintf(stderr,shmdt failed\n); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } 写入进程 [cpp] view plaincopy /********************************************************** *实验要求 创建两个进程通过共享内存进行通讯。 *功能描述 本程序申请了上一段程序相同的共享内存块然后循环向共享中 * 写数据直至写入“end”。 *日 期 2010-9-17 *作 者 国嵌 **********************************************************/ #include unistd.h #include stdlib.h #include stdio.h #include string.h #include sys/types.h #include sys/ipc.h #include sys/shm.h #include shm_com.h /* * 程序入口 * */ int main(void) { int running1; void *shared_memory(void *)0; struct shared_use_st *shared_stuff; char buffer[BUFSIZ]; int shmid; /*创建共享内存*/ shmidshmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT); if(shmid-1) { fprintf(stderr,shmget failed\n); exit(EXIT_FAILURE); } /*映射共享内存*/ shared_memoryshmat(shmid,(void *)0,0); if(shared_memory(void *)-1) { fprintf(stderr,shmat failed\n); exit(EXIT_FAILURE); } printf(Memory attached at %X\n,(int)shared_memory); /*让结构体指针指向这块共享内存*/ shared_stuff(struct shared_use_st *)shared_memory; /*循环的向共享内存中写数据直到写入的为“end”为止*/ while(running) { while(shared_stuff-written_by_you1) { sleep(1);//等到读进程读完之后再写 printf(waiting for client...\n); } printf(Ener some text:); fgets(buffer,BUFSIZ,stdin); strncpy(shared_stuff-some_text,buffer,TEXT_SZ); shared_stuff-written_by_you1; if(strncmp(buffer,end,3)0) { running0; //结束循环 } } /*删除共享内存*/ if(shmdt(shared_memory)-1) { fprintf(stderr,shmdt failed\n); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } 3 . 在一个终端中运行shm1在另一个终端中运行shm2.当shm1运行起来之后由于共享内存中没有数据可读会处于等待状态 [rootlocalhost 2-4-4]# ./shm1 Memory attached at B7F9A000 /***阻塞***/ 再向shm2运行的终端输入字符串 [rootlocalhost 2-4-4]# ./shm2 Memory attached at B7FD8000 Enter some textImpossible is nothing waiting for client。。。 waiting for client。。。 Enter some textAnything is possible waiting for client。。。 Ener some textend [rootlocalhost 2-4-4]# shm1能够逐个从共享内存中巴他们读出来知道双方晕倒字符串end后两个程序都退出。 [rootlocalhost 2-4-4]# ./shm1 Memory attached at B7F9A000 You writeImpossible is nothing You writeAnything is possible You writeend [rootlocalhost 2-4-4]# 以上运行过程中红色表示在终端1中运行的结果蓝色表示在终端2里面运行的结果。