概述
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对应标准输出一样。向管道文件读写数据其实是在读写内核缓冲区。
管道创建成功以后,创建该管道的进程(父进程)同时掌握着管道的读端和写端。如何实现父子进程间通信呢?通常可以采用如下步骤:
#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:匿名管道pipe所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复