无名管道 anonymous pipe
无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
- #include<stdio.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<fcntl.h>
- #include<unistd.h>
- #include<stdlib.h>
- int main(char argc,char *argv[])
- {
- if(argc<3)
- {
- printf("请输入三个文件名\n");
- return -1;
- }
- //打开被复制的文件
- int i,j;
- if(0>(i = open(argv[1],O_RDONLY)))
- {
- perror("open 1");
- return -1;
- }
- //打开要复制的文件
- if(0>(j = open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0777)))
- {
- perror("open 2");
- return -1;
- }
- //创建无名管道
- int fd[2]; //管道读写文件描述符
- if(0 !=pipe(fd))
- {
- perror("pipe");
- exit(-1);
- }
- char buf[100];
- //创建父子进程
- pid_t pid;
- if(0>(pid=fork()))
- {
- perror("fork");
- exit(-1);
- }
- //子进程中将管道内容读入文件
- else if(pid == 0)
- {
- int q;
- close(fd[1]);
- //从管道中将内容读到数组中
- while(1){
- if(0>(q=read(fd[0],buf,sizeof(buf))))
- {
- perror("read");
- exit(-1);
- }
- else if(q==0)
- {
- printf("read end1\n");
- close(fd[0]);
- return 0;
- }
- //从数组中将内容写入文件
- if(0>write(j, buf, q))
- {
- perror("write");
- return 0;
- }
- }
- }
- //父进程中将文件内容写入管道
- {
- int p;
- close(fd[0]);
- //将文件内容读入数组中
- while(1){
- if(0>(p=read(i,buf,sizeof(buf))))
- {
- perror("read");
- exit(-1);
- }
- else if(p==0)
- {
- printf("read end\n");
- close(fd[1]);
- return 0;
- }
- //从数组中将内容写入管道
- if(0>write(fd[1],buf, p))
- {
- perror("write");
- return 0;
- }
- }
- }
- }