Linux中文件描述符的复制-dup2函数(过程详解)

在我们学习Linux的过程中,对文件的输入输出接触的比较多的一个函数就是dup2函数,我们也可以用dup2函数进行重定向;

一、dup2函数的介绍
函数:

dup2(int oldfd,int newfd);

1、所包含头文件

#include<unistd.h>

2、功能
文件描述符的复制
3、返回值
成功返回新文件描述符
失败返回-1

二、文件描述符简要介绍
在这里插入图片描述
在文件描述符中,0、1、2被系统占用
0:表示标准输入(键盘输入)
1:表示标准输出(屏幕输出)
2:表示标准错误
所以,当我们打开一个文件时,返回的文件描述符都是大于等于3的。

当我们使用标准输入输出的时候要添加头文件

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

三、文件描述符的复制
我们知道文件描述符返回的是一个数字,数字可以复制吗?肯定是不行的,所以我们所说的文件描述符的复制是指针,这里我们以一个程序来进行说明

#include<stdio.h>
#include<fcntl.h>
#include<string.h>
#include<errno.h>
#include<sys/stat.h>
#include<sys/type.h>
#include<unistd.h>
#define BUFFER_LINE 4096
//为了实现输入输出效果,这里编写一个函数实现读写以及打印功能
void copy(int fdin,int fdout);

int main(int argc,char *argv[])
{
	int fd_in,fd_out;
	int i;
	for(i=1;i<argc;i++)
	{
		fd_in = open(argv[i],O_RDONLY);
		if(fd_in < 0){
			perror("open error");
			exit(1);
		}
		//这里我们可以将fd_in的值打印出来看一下,是不是和我们之前所讲的一样,大于等于3
		printf("fd_in ==== %d\n",fd_in);
	}
//使用dup2将标准输入改为从fd_in中输入
	if(dup2(fd_in,STDIN_FILENO)!=STDIN_FILENO)
	{
		perror("dup2 error");
		exit(1);
	}
	close(fd_in);

//STDIN_FILENO已经从标准输入(键盘)改为从文件输入,STDPUT_FILENO仍然是标准输出(屏幕)
copy(STDIN_FILENO,STDOUT_FILENO);

return 0;	
}

//在此处进行函数实现
void copy(int fdin,int fdout)
{
	char buffer[BUFFER_LINE];
	ssize_t size;
	while((size = read(fdin,buffer,BUFFER_LINE))>0)
	{
		if(write(fdout,buffer,size)!=size)
		{
			perror("write error");
			exit(1);
		}
	}
	if(size < 0)
	{
		perror("read error");
		exit(1);	
	}
}



结果显示如下:
在这里插入图片描述
当我们运行该程序后,标准输出的是我们iotek.txt里面的内容

文件描述符复制过程图解
在这里插入图片描述
1:代表将fd_in 的指针复制到STDIN_FILENO,所以STDIN_FILENO指向的也是读取的文件

接下来,我们在写一个程序,重定向标准输出

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<sys/types.h>
#include<fcntl.h>

int main(int argc,char * [])
{
	int fd_out;
	fd_out = open(argv[1],O_CREAT|O_WRONLY,0777);
	if(fd_out < 0)
	{
		perror("open error");
		exit(1);
	}
	printf("fd_out ====== %d\n",fd_out);
	//重定向标准输出  将标准输出(屏幕)重定向到fd_out
	if(dup2(fd_out,STDOUT_FILENO)!=STDOUT_FILENO)
	{
		perror("dup2 error");
		exit(1);
	}
	close(fd_out);
	//此时printf将不会在屏幕上输出  而是会输出到fd_out所指的文件中
	printf("abc");
}

结果显示如下:
在这里插入图片描述
从两个程序的结果可知:
文件描述符的复制过程:返回的新文件描述符一定是当前可用文件描述符中的最小数值
在这里插入图片描述

文章是个人在学习过程中的一些思考与理解,如果不对的地方,还请指正,必会虚心接受并加以更改!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值