概念:
只能用于亲缘关系进程间(fork()诞生的),无名管道一种文件,没有名字,所以只能在亲缘进程中去继承他的描述符。
相关接口:
功能 | 创建无名管道:PIPE | |
头文件 | #include <unistd.h> | |
原型 | int pipe(int pipefd[2]); | |
参数 | pipefd | 一个至少具有2个 int 型数据的数组,用来存放PIPE的读写描述符 |
返回值 | 成功 | 0 |
失败 | -1 |
创建无名管道相关代码:
- 定义一个数组存放PIPE的两个文件描述符:int fd[2];
其中通过读端fd[0]将数据读入PIPE,通过写端fd[1]将数据写入PIPE
- 创建一个子进程,他将会继承PIPE的描述符: pid_t pid=fork();
pid==0时,是子进程 。pid>0时,是父进程。
以下展示子进程通过PIPE向父进程发送一段数据:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
int main(){
int fd[2]; //定义两个元素整数数组
if(pipe(fd)==-1){ //创建无名管道
perror("pipe err");
return -1;
}
pid_t pid=fork(); //生成进程
if(pid==0){ //子进程
char s[32];
fgets(s,sizeof(s),stdin);
write(fd[1],s,strlen(s));
}
if(pid>0){ //父进程
char buf[32];
memset(buf,0,sizeof(buf)); //可用bzero(buf,32);替换
read(fd[0],buf,32);
printf("from child;%s",buf);
}
close(fd[0]);
close(fd[1]);
return 0;
}