我是靠谱客的博主 丰富果汁,这篇文章主要介绍Linux系统编程2:匿名管道pipe,现在分享给大家,希望可以做个参考。

pipe函数
匿名管道,用于有血缘关系之间进程的通信
调用pipe()函在内核中开辟一块缓冲区(称为管道)用于通信,它有一个读端和写端,然后通过参数传出给用户程序两个文件描述符,fd[0]指向管道的读端,fd[1]指向管道的写端。所以管道在用户程序看起来像一个打开的文件。通过read(fd[0])或者writefd[1]向这两个文件读写数据其实时在读写内核缓冲区。pipe函数成功返回0 调用失败返回-1.

创建管道
int pipe(int pipefd[2]); 成功:0;失败:-1,设置errno
函数调用成功返回r/w两个文件描述符。无需open,但需手动close。规定:fd[0] → r; fd[1] → w,就像0对应标准输入,1对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。
管道创建成功以后,创建该管道的进程(父进程)同时掌握着管道的读端和写端。如何实现父子进程间通信呢?通常可以采用如下步骤:
在这里插入图片描述

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include<stdio.h> #include<unistd.h> #include<string.h> #include<stdlib.h> int main(void){ int fd[2]; char str[1024]="hello world"; char buf[1024]; //fd[0]读端,fd[1]写端 if(pipe(fd)<0){ perror("pipe"); exit(1); } pid_t pid=fork(); //父写子读 if(pid>0){//父进程, close(fd[0]); sleep(2); write(fd[1],str,strlen(str)); wait(NULL); }else if(pid==0){ //子进程里子进程关闭写端 close(fd[1]); int len; //read返回值 读到字节的返回值长度 len=read(fd[0],buf,sizeof(buf)); write(STDOUT_FILENO,buf,len); }else{//调用失败 perror("fork"); exit(1); } return 0; }

注意事项:
写端关闭,写端无数据,读端读完管道数据时,再次读,返回0 相当读到EOF。
写端未关闭,写端暂时无数据,读端读完管道中的数据时,再次读,阻塞。
读端关闭,写端写满数据,产生SIGPIPE信号,导致写进程终止。
读端没去读管道数据,当写端写满管道后,再次写,阻塞。

最后

以上就是丰富果汁最近收集整理的关于Linux系统编程2:匿名管道pipe的全部内容,更多相关Linux系统编程2内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(87)

评论列表共有 0 条评论

立即
投稿
返回
顶部