利用管道实现文件复制:1、父程序读端关闭,写端先将文件数据写入管道;2、子程序将写端关闭,然后从管道里读文件数据。
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#define SIZE 1024
// 子进程通过管道从父进程接收数据
void child_do(int *fd)
{
//关闭管道写端
close(fd[1]);
//打开一个文件
int fd_write = open("新建文本文档1.txt",O_RDWR | O_CREAT,0777);
if(fd_write == -1)
{
perror("open");
return;
}
int ret;
char buf[SIZE] = {0};
// read 从管道读数据,如果管道没有数据可读,read 会阻塞
// 如果 管道的写端 被关闭, read 返回 0
while(ret = read(fd[0],buf,SIZE))
{
if(ret == -1)
{
perror("read");
return;
}
//把从父进程接收到的数据写入新文件中
write(fd_write,buf,ret);
}
printf("文件复制成功\n");
//关闭读端 新文件
close(fd[0]);
close(fd_write);
}
// 父进程通过管道向子进程发送数据
void father_do(int *fd)
{
//将管道读端关闭
close (fd[0]);
int fd_read = open("新建文本文档.txt",O_RDONLY ,0777);
if(fd_write == -1)
{
perror("open");
return;
}
int ret;
char buf[SIZE] = {0};
while(ret = read(fd_read,buf,SIZE))
{
if (ret == -1)
{
perror ("read");
break;
}
//把读到的内容发送给子进程
write(fd[1],buf,ret);
}
// 关闭写端 和文件
close (fd[1]);
close (fd_read);
}
int main ()
{
//创建管道
int fd[2];
int ret = pipe[fd];
if(ret == -1)
{
perror("pipe");
return -1;
}
//创建子程序
pid_t pid = fork();
switch(pid)
{
case -1:
{
perror("fork");
break;
}
case 0: //子程序
{
child_do(fd);
break;
}
default:
{
father_do(fd);
break;
}
}
return 0;
}