一、管道分为无名管道和命名管道
接下来看看《UNIX环境高级编程》的介绍
管道:通常指的是无名管道
二、man手册原型:
NAME
pipe, pipe2 - create pipe
SYNOPSIS
#include <unistd.h>
int pipe(int pipefd[2]);
原型:
#include <unistd.h>
int pipe(int fd[2]); // 返回值:若成功返回0,失败返回-1
当一个管道建立的时候,他会创建两个文件描述符:fd[0] 与 fd[1]。fd[0]表示读,fd[1]表示写。(怎么记忆比较好呢?我们正常读的顺序为“01”,对应“读写”,有没有好记一点?)
若是想要关闭管道至于要关闭两个文件描述符即可:如close(fd[1])、close(fd[0]);
上图!
温馨提示:管道这里的文件描述符跟文件编程的文件描述符是不一样的。
三、举例子
若要数据流从父进程流向子进程,则关闭父进程的读端(fd[0]
)与子进程的写端(fd[1]
);反之,则可以使数据流从子进程流向父进程:
如图所示:
举个例子
文件拷贝(不懂得参考文件编程总结二:https://mp.csdn.net/postedit/88817936)。父进程负责擦源文件的内容读出,然后把内容通过管道传给子进程,子进程把内容从管道读出,写入新文件。
代码实现:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc , char *argv[])
{
int fdS;
int fdD;
int fd[2];
pipe(fd);
char readBuf[] = {0};
if(argc != 3){
printf("param error!\n");
exit(-1);
}
pid_t pid = fork(); //创建一个子进程
if(pid != 0){
close(fd[0]); //父进程关闭读端
fdS = open(argv[1],O_RDWR);
int size = lseek(fdS,0,SEEK_END);
lseek(fdS,0,SEEK_SET);
int n_read = read(fdS,readBuf,size);
write(fd[1],readBuf,1024); //父进程将readBuf里面的内容放到管道
}else{
close(fd[1]); //子进程关闭写端
read(fd[0],readBuf,1024); //子进程读取readBuf里面的内容
fdD = open(argv[2],O_RDWR,0600);
int n_write = write(fdD,readBuf,strlen(readBuf));
}
close(fdS);
close(fdD);
close(fd[0]); //记得关闭哦~
close(fd[1]);
return 0;
}
~
运行如下: