对输入文件描述符重定向函数dup/dup2

12 篇文章 0 订阅

概述

今天在学习的时候,遇到了两个非常有用的函数,这里呢我就仔细介绍一下:


这两个函数是非常有用的,它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。

dup()函数

利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。例如,如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的。

需要注意的是,我们可以在调用fork之前建立一个描述符,这与调用dup建立描述符的效果是一样的,子进程也同样会收到一个复制出来的描述符。

测试实例:

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>

int main()
{
	int fd = open("./file", O_CREAT|O_RDWR, 0644);
	if(fd < 0)
	{
		perror("open");
		return 1;
	}
	close(1);

	int new_fd = dup(fd);
	if(new_fd < 0)
	{
		perror("dup");
		return 2;
	}
	close(fd);
	
	char buf[1024];
	while(1)
	{
		ssize_t s = read(0, buf, sizeof(buf)-1);
		if(s < 0)
		{
			perror("read");
			return 3;
		}
		else
		{
			buf[s] = 0;
		}

		if(strncmp("quit", buf, 4) == 0)
			break;

		printf("%s", buf);
		fflush(stdout);
		sleep(1);
	}
	close(new_fd);
	return 0;
}
然后我们运行这个程序


我们在运行之后输入一些内容,然后quit退出,然后ls一下发现file文件已经创建好了,然后打开file文件后发现


之前在标准输入输入的字符已经被放在这个文件里面了,说明标准输入被重定向到这个文件中了。

dup2()函数

dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。

测试实例:

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>

int main()
{
	int fd = open("./file2", O_CREAT|O_RDWR, 0644);
	if(fd < 0)
	{
		perror("open");
		return 1;
	}

	int new_fd = dup2(fd, 1);
	if(new_fd < 0)
	{
		perror("dup2");
		return 2;
	}
	close(fd);
	char buf[1024];
	while(1)
	{
		ssize_t s = read(0, buf, sizeof(buf)-1);
		if(s < 0)
		{
			perror("read");
			return 3;
		}
		else
		{
			buf[s] = 0;
		}
		if(strncmp("quit", buf, 4) == 0)
			break;
		printf("%s", buf);
		fflush(stdout);
		sleep(1);
	}
	close(new_fd);
	return 0;
}
然后我们去运行一下程序:


我们可以看到这里也是实现了标准输入的重定向。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值