欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

mmap无血缘关系进程间通信

发布时间:2023/11/30 编程问答 43 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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无血缘关系进程间通信的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。