(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().