使用dup2+fgets+printf 实现文件拷贝功能

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

typedef struct sockaddr_in addr_in_t;
typedef struct sockaddr addr_t;
typedef struct sockaddr_un addr_un_t;
int main(int argc, const char *argv[])
{
	if(argc != 3)
	{
		perror("输入参数不正确");
		return 1;
	}

	int fd_src = open(argv[1],O_RDONLY);//以只读形式打开源文件
	if(fd_src == -1)
	{
		perror("error opening");
		close(fd_src);
		return 1;
	}

	int fd_dst = open(argv[2],O_WRONLY | O_CREAT | O_TRUNC,0644);//以0644权限可写形式打开目标文件
	if(fd_dst == -1)
	{
		perror("error opening");
		close(fd_dst);
		return 1;
	}

	//备份起初的标准输入和标准输出流
	int saved_stdin = dup(0);
	int saved_stdout = dup(1);
	if(saved_stdin == -1|| saved_stdout ==-1)
	{
		perror("error saving");
		close(fd_src);
		close(fd_dst);
		return 1;
	}

	//重定向标准输入流到源文件
	if(dup2(fd_src,0) == -1)
	{
		perror("error redirecting");
		close(fd_src);
		return 1;
	}
	close(fd_src);//关闭起初fd_src

	//重新定向标准输出流到目标文件
	if(dup2(fd_dst,1) == -1)
	{
		perror("error redirecting");
		close(fd_dst);
		return 1;
	}
	close(fd_dst);//关闭起初fd_dst

	//使用fgets和printf实现数据拷贝
	char buf[1024]={0};
	while(fgets(buf,sizeof(buf),stdin) != NULL)
	{
		printf("%s",buf);
	}
	fflush(stdout);//强制刷新缓冲区

	//恢复原始标准输入流和标准输出流
	if(dup2(saved_stdin,0) == -1)
	{
		perror("error restoring");
		return 1;
	}

	if(dup2(saved_stdout,1) == -1)
	{
		perror("error restoring");
		return 1;
	}

	//关闭备份
	close(saved_stdin);
	close(saved_stdout);





	return 0;
}

效果展示

使用dup2+fgets+printf 实现文件拷贝功能_第1张图片

你可能感兴趣的:(linux)