IPC---共享内存的使用

(1)管道(使用最简单):pipe,匿名管道,不可反复读 / fifo 有名管道,可以反复读(用于非血缘关系进程间通信)
原理:内核缓冲区机制,环形队列形式实现
局限性: 1.进程不能自己读自己写
2.数据不能反复读
3.单向通信,半双工
4.只能用与有公共的祖先进程间
(2)信号(开销最小)
(3)共享内存(可以无血缘关系):mmap-------munmap(释放分配出来的共享内存,一定要从首地址开始释放)
void *mmap(void *addr, size_t length, int prot, int flags int fd, off_t offset )
返回值:成功返回创建映射去的首地址,失败返回MAP_FAILED宏
参数: 1.add,建立映射区的首地址,由内核指定,使用时直接NULL;
2.length, 欲创建映射区的大小
3.prot,映射区权限,PROT_READ,PROT_WRITE,PROT_READ | PROT_WRITE
4.flags, 标志为参数,MAP_SHARED(将映射区 所做的操作反映到磁盘上)
MAP_PRIVATE(映射区所作的修改不会反映到磁盘上)
5.fd, 用来建立映射区的文件描述符(文件必须读写打开,因为4会通过共享内存往磁盘上写)
6.映射文件的偏移量(4K的整数倍)
(4)本地套接字(最稳定)

父子进程之间共享内存通信(有血缘关系通信)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/mman.h>
  4 #include<unistd.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 
  8 int main()
  9 {
 10         int fd = open("mytest.txt",O_RDWR | O_CREAT,0644);
 11         if(fd == -1 )
 12         {
 13                 perror("open error");
 14                 exit(1);
 15         }
 16 
 17         int len = ftruncate(fd,4);
 18         if(len == -1)
 19         {
 20                 perror("ftruncate error");
 21                 exit(1);
 22         }
 23         char * p=NULL;
 24         p = mmap(NULL,4,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);
 25         if( p == MAP_FAILED )
 26         {
 27                 perror("mmap error");
 28                 exit(1);
 29         }
 30         strcpy(p,"abvc\n");
 31 
 32         int ret = munmap(p,4);
 33         if(ret == -1)
 34         {
 35                 perror("mummap error");
 36                 exit(1);
 37         }
 38         close(fd);
 39         return 0;
 40 }

无血缘关系进程之间通信
mmap_r.c(读端进程)

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<sys/mman.h>
  4 #include<unistd.h>
  5 #include<fcntl.h>
  6 #include<string.h>
  7 struct student{
  8 
  9         int id;
 10         char name[20];
 11         char sex;
 12 };
 13 int main()
 14 {
 15         int fd = open("file_shared.txt",O_RDWR | O_CREAT,0644);
 16         if(fd == -1 )
 17         {
 18                 perror("open error");
 19                 exit(1);
 20         }
 21 
 22         struct student st;
 23         int len = ftruncate(fd,sizeof(st));
 24         if(len == -1)
 25         {
 26                 perror("ftruncate error");
 27                 exit(1);
 28         }
 29         struct student * p=NULL;
 30         p = mmap(NULL,sizeof(st),PROT_READ,MAP_SHARED,fd,0);
 31         if( p == MAP_FAILED )
 32         {
 33                 perror("mmap error");
 34                 exit(1);
 35         }
 36 
 37         while(1)
 38         {
 39                 sleep(2);
 40                 printf("正在读取中.....\n");
 41                 printf("id=%d,name=%s, sex=%c\n",p->id,p->name,p->sex);
 42 
 43         }
 44         int ret = munmap(p,sizeof(st));
 45         if(ret == -1)
 46         {
 47                 perror("mummap error");
 48                 exit(1);
 49         }
 50         close(fd);
 51         return 0;
 52 }

mmap_w.c().

发布了38 篇原创文章 · 获赞 13 · 访问量 4334

猜你喜欢

转载自blog.csdn.net/YanWenCheng_/article/details/103935650