1、pipe基本用法
函数原型:
int pipe(int file_descriptor[2])
参数:
file_descriptor[2]:两个元素的整数数组
返回值:
成功: 返回0,并通过值file_descriptor[2]传出两个文件描述符号;
file_descriptor[0] : 通过此文件描述法从从管道读出数据
file_descriptor[1] : 通过此文件描述符向管道写数据
note :(1)写进程------file_descriptor[1] ----> pipe -------file_descriptor[0]------>读进程;若反过来读写,则可能发生未知错误。
数据进出管道顺序FIFO
(2)若关闭pipe的写入一端,则对于读取进程,read不会阻塞于等待数据,而是直接返回0
(3) fork调用中file_descriptor[2]有两份,欲关闭管道,必须将二者均关闭
e.g.1 通过fork调用创建子进程,并通过pipe在父子进程之间通信
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NUM 30
int main(){
int pid;
int fd[2];
char buffer[NUM];
if(pipe(fd)==0){ //pipe调用成功
pid = fork();
if(pid==-1){
exit(0);
}
else if(pid==0){ //子进程
memset(buffer,'\0',NUM);
read(fd[0],buffer,NUM-1);
}
else{ //父进程
memset(buffer,'\0',NUM);
write(fd[1],buffer,strlen(buffer));
}
}
return 0;
}
e.g.2 通过execl调用创建新进程,并通过pipe在两个进程之间通信
2、pipe作用于文件描述符0,1
首先会使用到这两个函数
dup函数原型: int dup(int file_descriptor)
参数: file_descriptor,文件描述符
返回值: 返回与file_descriptor指向相同文件的最小可用文件描述符
dup2函数原型: int dup2(int file_descriptor_one,int file_descriptor_two)
类似于dup,但是其第二个参数指明想要创建file_descriptor_two来重复指向file_descriptor指向的文件,若file_descriptor_two被 占用,则返回第一个大于file_descriptor_two且未被占用的值
note:
(1)、现在可以通过, close(0) ;dup(file[0]),此时均可从0和file[0]读出管道中的数据,由于0又是标准输入,则可以直接使用从标准输入读 数据的函数,而此时,事实上,这些函数处理的是从管道输出的数据。
(2)、close(1),dup(file[1])与上述是同一个道理。