共享内存的创建和映射shmget()和shmat()
来源:互联网 发布:网络推广经理工作职责 编辑:程序博客网 时间:2024/05/22 14:22
comments:record 这里面的sharemory 更主要是字符串比较和copy。总不用这个看了2遍才看懂。
共享内存的实现分为两步:
1、创建共享内存,用到的函数是shmget();
2、映射共享内存,就是把这段创建的共享内存映射到具体的进程空间去,使用的函数是:shmat();
这样就可以使用不带缓冲的I/O读写命令对其进行操作了。
实例如下:
- /*
- * shmem.c
- *
- * Created on: 2012-7-20
- * Author: liwei.cai
- */
- /**
- * 该实例说明:如何使用基本的共享内存函数。
- * 功能:首先创建一个共享内存区,之后创建子进程,在父子进程中将共享内存
- * 分别映射到各自的进程地址空间中。
- * 父进程先等待用户输入,然后将用户输入的字符串写入到共享内存,之
- * 后往共享内存的头部写入“WROTE”字符串表示父进程已成功写入数据。子进程
- * 一直等待共享内存的头部字符串是“WROTE”,然后将共享内存的有效数据打印
- * 出来,之后父子进程分别解除与共享内存的映射。
- * 最后在子进程中删除共享内存。
- */
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/shm.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define BUFFER_SIZE 2048
- int main()
- {
- pid_t pid;
- int shmid;
- char *shm_addr;
- char flag[] = "WROTE";
- char *buff;
- //创建共享内存
- if ((shmid = shmget(IPC_PRIVATE, BUFFER_SIZE, 0666)) < 0)
- {
- perror("shmget");
- exit(1);
- }
- else
- {
- printf("Create shared-memory: %d\n", shmid);
- }
- //显示共享内存的情况
- system("ipcs -m");
- pid = fork();
- if (pid == -1)
- {
- perror("fork");
- exit(1);
- }
- else if (pid == 0) //子进程
- {
- // 映射共享内存
- if ((shm_addr = shmat(shmid, 0, 0)) == (void*)-1)
- {
- perror("Child: shmat");
- exit(1);
- }
- else
- {
- printf("Child:Attach shared-memory: %p\n", shm_addr);
- }
- system("ipcs -m");
- //通过检查在共享内存的头部是否标志字符串“WROTE”来确认
- //父进程已经此案够共享内存写入有效数据
- while(strncmp(shm_addr, flag, strlen(flag)))
- {
- printf("Child: wait for enable data...\n");
- sleep(5);
- }
- //获取共享内存的有效数据并显示
- strcpy(buff, shm_addr + strlen(flag));
- printf("Child: Shared-memory: %s\n", buff);
- //解除共享内存映射
- if((shmdt(shm_addr)) < 0)
- {
- perror("shmdt");
- exit(1);
- }
- else
- {
- printf("Child: Deattach shared-memory\n");
- }
- system("ipcs -m");
- //删除共享内存
- if(shmctl(shmid, IPC_RMID, NULL) == -1)
- {
- perror("Child: shmctl(IPC_RMID)\n");
- exit(1);
- }
- else
- {
- printf("Delete shared-memory\n");
- }
- system("ipcs -m");
- }
- else //父进程
- {
- //映射共享内存
- if ((shm_addr = shmat(shmid, 0, 0)) == (void*)-1)
- {
- perror("Parent: shmat");
- exit(1);
- }
- else
- {
- printf("Parent:Attach shared-memory: %p\n", shm_addr);
- }
- sleep(1);
- printf("\n Input some string: \n");
- fgets(buff, BUFFER_SIZE,stdin);
- strncpy(shm_addr + strlen(flag), buff, strlen(buff));
- strncpy(shm_addr, flag, strlen(flag));
- //解除共享内存映射
- if((shmdt(shm_addr)) < 0)
- {
- perror("shmdt");
- exit(1);
- }
- else
- {
- printf("Parent: Deattach shared-memory\n");
- }
- system("ipcs -m");
- waitpid(pid, NULL, 0);
- printf("Finished\n");
- }
- exit(0);
- }
运行调试的时候出现,堆栈错误,请读者仔细阅读和修改代码,找出错误,附在下面。
http://blog.csdn.net/cailiwei712/article/details/7766831
0 0
- 共享内存的创建和映射shmget()和shmat()
- 共享内存的创建和映射shmget()和shmat()
- (内存共享)shmget shmat和shmdt 基本内容 linux
- 共享内存shmget shmat
- 共享内存的使用-shmget-shmat-shmdt
- 共享内存---shmget shmat shmdt
- 共享内存---shmget shmat shmdt
- 共享内存---shmget shmat shmdt
- 共享内存---shmget shmat shmdt
- 共享内存---shmget shmat shmdt
- 共享内存---shmget shmat shmdt
- 共享内存---shmget shmat shmdt
- 共享内存---shmget shmat shmdt
- 共享内存---shmget shmat shmdt
- 共享内存的常用函数详解shmget shmat
- 共享内存的常用函数详解shmget shmat
- 进程间通信,共享内存(shmget,shmat)
- 共享内存函数(shmget、shmat、shmdt、shmctl)
- hdu1312——深度搜索(dfs)
- SQL常用语句
- 区间估计:
- 关联引用
- 删除链表中的重复节点
- 共享内存的创建和映射shmget()和shmat()
- SQL字符串函数
- 6.28 洗刷刷 oj 继承 private protocted
- [学习笔记—Objective-C]《Objective-C 程序设计 第6版》第六章 选择结构
- EA那些小事
- 别人抢红包,我们研究一下红包算法
- SQL使用一张表的数据更新另一张表
- Solaris 10 改ip参考文档之一
- java学习之旅36--面向对象_09_static变量和方法_内存分析static