mmap无血缘关系进程间通信
生活随笔
收集整理的这篇文章主要介绍了
mmap无血缘关系进程间通信
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
实质上mmap是内核借助文件帮我们创建了一个映射区,多个进程之间利用该映射区完成数据传递。由于内核空间多进程共享,因此无血缘关系的进程间也可以使用mmap来完成通信。只要设置相应的标志位参数flags即可。若想实现共享,当然应该使用MAP_SHARED了。
// mmap_w.c
#include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <sys/mman.h> #include <string.h>struct STU {int id;char name[20];char sex; };void sys_err(char *str) {perror(str);exit(1); }int main(int argc, char *argv[]) {int fd;struct STU student = {10, "xiaoming", 'm'};struct STU *mm;if (argc < 2) {printf("./a.out file_shared\n");exit(-1);}fd = open(argv[1], O_RDWR | O_CREAT, 0664);ftruncate(fd, sizeof(student));mm = mmap(NULL, sizeof(student), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);if (mm == MAP_FAILED)sys_err("mmap");close(fd);while (1) {memcpy(mm, &student, sizeof(student));student.id++;sleep(1);}munmap(mm, sizeof(student));return 0; }// mmap_r.c
#include <stdio.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <stdlib.h> #include <sys/mman.h> #include <string.h>struct STU {int id;char name[20];char sex; };void sys_err(char *str) {perror(str);exit(-1); }int main(int argc, char *argv[]) {int fd;struct STU student;struct STU *mm;if (argc < 2) {printf("./a.out file_shared\n");exit(-1);}fd = open(argv[1], O_RDONLY);if (fd == -1)sys_err("open error");mm = mmap(NULL, sizeof(student), PROT_READ, MAP_SHARED, fd, 0);if (mm == MAP_FAILED)sys_err("mmap error");close(fd);while (1) {printf("id=%d\tname=%s\t%c\n", mm->id, mm->name, mm->sex);sleep(2);}munmap(mm, sizeof(student));return 0; }结论:该方式与利用文件进行通信的方式相似,只是mmap更加简单。只要映射的是同一个文件,且采用MAP_SHARED参数即可,这样共享映射的空间。
strace命令。 strace ./test 追踪可执行文件test在程序执行过程中使用了哪些系统调用。
总结
以上是生活随笔为你收集整理的mmap无血缘关系进程间通信的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 打造适合消费者的产品,海信新风空调?
- 下一篇: 信号的概念与机制