当前位置:   article > 正文

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

dup2 stdin

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

一、dup2函数的介绍
函数:

dup2(int oldfd,int newfd);
  • 1

1、所包含头文件

#include<unistd.h>
  • 1

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

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

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

#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
  • 1
  • 2
  • 3

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

#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);	
	}
}



  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

结果显示如下:
在这里插入图片描述
当我们运行该程序后,标准输出的是我们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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/462674
推荐阅读
相关标签
  

闽ICP备14008679号