管道通讯(父读子写)
互斥:任何时刻只能有一个人正在使用某种资源
管道内部自动提供了互斥与同步机制
如果写端关闭,读端就会read返回值0,代表文件结束
如果打开文件的进程退出,文件也会被释放
文件的生命周期随进程
<管道的流式服务>
管道是半双工,就是数据只可以向一个方向流动
匿名管道,适合具有血缘关系的进程进行进程间通讯
read :没有内容挂起
write:没有空间挂起
如若管道没有父进程读,就会读文件错误。
read关闭,一直写,写方(child)被操作系统杀掉,写入无意义
linux实现父子管道通讯的代码如下(父读子写)
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <sys/types.h>
4 #include <sys/wait.h>
5 #include <string.h>
6 #include <stdlib.h>
7
8 int main()
9 {
10 int fd[2]={0};
11
12 if(pipe(fd)<0) //创建读写的文件窗口
13 {
14 printf("pipe error!\n");
15 return 1;
16 }
17
18 //printf("fd[0]:%d\n",fd[0]);
19 //printf("fd [1]:%d\n",fd[1]);
20
21 pid_t id=fork();
22 if(id==0)
23 {
24 //child
25 close(fd[0]);
26 const char* str="hello,i am child!";
27 int count=10;
28 while(count)
29 {
30 write(fd[1],str,strlen(str));
31 count--;
32 sleep(1);
33 }
34 exit(0);
35 }
36
37 //father
38 close(fd[1]);
39 char buff[64];
40 while(1)
41 {
42 ssize_t s=read(fd[0],buff,sizeof(buff)); //s是实际读到的字节数 读的时候,因为管道里面的互斥,写一个读一个,所以感觉就/有sleep
43 if(s>0)
44 {
45 buff[s]='\0';
46 printf("child send to father# %s\n",buff);
47 }
48 else if(s==0) //如果写端关闭,读端自动读到0值
49 {
50 printf("read file end!\n");
51 break;
52 }
53 else
54 {
55 printf("read error!\n");
56 break;
57 }
58 }
59 waitpid(id,NULL,0);
60 return 0;
61 }