IPC之共享内存(3)
来源:互联网 发布:游戏程序员必看书籍 编辑:程序博客网 时间:2024/06/14 07:29
1、共享内存
共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存写入一段数据,共享这个区域的所有进程就能立刻共享其中的内容。
2、共享内存实现
(1)创建共享内存,使用shmget函数。
#include <sys/shm.h>int shmget(key_t key, size_t size, int shmflg);
key:当 key 取值为 IPC_PRIVATE时,则函数shmget()
将创建一段新的共享内存;如果 key 取值为0,而参数 shmflg 被设置为 IPC_PRIVATE 这个标志,则同样会创建一段新的共享内存。
返回值:如果成功,则返回共享内存标识符;否则返回-1.
(2)映射共享内存,将这段创建的共享内存映射到具体的进程里空间去,使用shmat函数。
#include <sys/shm.h>void *shmat(int shmid, const void *addr, int flag);
shmid:shmget 返回的的共享内存标志符;
flag:决定以什么方式来确定映射的地址(通常为0)
返回值:如果成功,则返回共享内存映射到进程的地址,否则返回-1。
(3)共享内存解除。
#include <sys/shm.h>int shmdt(char *shmaddr);
当一个进程不在需要共享内存时,需要把它从进程地址空间中脱离。
3、父、子进程共享内存
demo:
#include <apue.h>#include <sys/shm.h>#define SHMFLG (S_IRUSR | S_IWUSR)int main(int argc, char *argv[]){ int shmid; pid_t pid; char *p_addr; char *c_addr; int i; if (argc == 1){ fprintf(stderr, "Usage : %s [data...]\n", argv[0]); exit(1); } /* 创建共享内存 */ if ((shmid = shmget(IPC_PRIVATE, 1024, SHMFLG)) == -1){ fprintf(stderr, "Create share memory error : %s\n\a", strerror(errno)); exit(1); } /* 创建子进程 */ if ((pid = fork()) < 0){ fprintf(stderr, "fork error\n"); exit(1); } else if (pid > 0){ // 父进程想共享内存写数据 printf("Parent process writing data to share memory...\n"); p_addr = shmat(shmid, 0, 0); memset(p_addr, '\0', 1024); for (i = 1; i < argc; i++){ strcat(p_addr, " "); strcat(p_addr, argv[i]); } waitpid(pid, NULL, 0); exit(0); } else{ // 子进程从共享内存读数据 sleep(1); // 让父进程有足够的时间写数据 c_addr = shmat(shmid, 0, 0); fprintf(stdout, "Child process reading data form share memory...%s\n", c_addr); exit(0); } exit(0);}
阅读全文
0 0
- IPC之共享内存(3)
- IPC之共享内存
- IPC之共享内存
- IPC之共享内存
- IPC之共享内存
- IPC之共享内存
- IPC之共享内存(1)
- IPC之共享内存(2)
- Linux IPC之共享内存
- IPC通信之共享内存
- IPC(SystemV) 之 共享内存
- Linux IPC之共享内存
- Linux-IPC之共享内存
- Linux IPC之共享内存
- IPC之共享内存(一)
- IPC之共享内存(二)
- IPC之共享内存(三)
- IPC之共享内存详解
- NGUI学习笔记(八):图片(UISprite)灰化效果
- 20、顺时针打印矩阵
- 插件加载---之一
- Linux下使用getopt函数来获取传入的参数
- Codeforces contest 295 recordings
- IPC之共享内存(3)
- Spring learn note
- 字符串匹配KMP算法
- Hibernate缓存总结
- 并发性:互斥和同步
- 进程总结
- eclipset调试1
- 组个最小数
- 非制冷和制冷型红外热像仪的区别