dup函数详解

本文详细介绍了Linux系统中的dup操作,该操作用于复制文件描述符,实现输入输出的重定向。复制后的新旧文件描述符共享同一文件、管道或网络连接,包括文件锁定、读写位置和权限。当关闭任意一描述符时,另一描述符仍可正常操作。需要注意的是,两者共享文件偏移量和状态标志,一处的修改会影响到另一处的读写位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dup操作

功能:复制文件描述符,重定向输入输出。
函数:

#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);

返回值:
	成功:dup函数返回当前系统可用的最小整数值。
		 dup2函数返回第一个不小于newfd的整数值,分两种情况:
		 	1. 如果newfd已经打开,则先将其关闭,再复制文件描述符;
		 	2. 如果newfd等于oldfd,则dup2函数返回newfd,而不关闭它。
	失败:dup和dup2函数均返回-1,并设置errno。

复制文件描述符后,新旧文件描述符的特点:

  1. 使用dup或dup2复制文件描述符后,新文件描述符和旧文件描述符指向同一个文件,管道或网络连接,共享文件的锁定、读写位置和各项权限。
  2. 当关闭新的文件描述符时,通过旧文件描述符仍可操作文件。
  3. 当关闭旧的文件描述符时,通过新的文件描述符仍可操作文件。

注意:
是共享文件偏移量和文件状态标志。
比如:其中一个使用lseek修改文件偏移量,另一个也会改变(读写等操作位置会改变)。

/* 例子:复制文件描述符,并向文件写数据 */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

void main()
{
	int oldfd,newfd;
	char *oldstr = "Write by oldfd.\n";
	char *newstr = "Write by newfd.\n";

	oldfd = open("test.txt", O_RDWR|O_CREAT, 0644);
	printf("oldfd = %d\n", oldfd);

	if(oldfd == -1) {
		printf("File open error\n");
		exit(-1); 
	}

	/* 开始复制 */
	newfd = dup(oldfd);
	printf("newfd = %d\n", newfd);

	/* 使用oldfd写 */
	write(oldfd, oldstr, strlen(oldstr));
	if(close(oldfd) == -1) {
		printf("Close oldfd error.\n");
		exit(-1);
	}

	/* 使用newfd写 */
	write(newfd, newstr, strlen(newstr));
	if(close(newfd) == -1) {
		printf("Close newfd error.\n");
		exit(-1);
	}
	exit(0);
}

执行结果:

终端输出:
oldfd = 3
newfd = 4

查看test.txt:
Write by oldfd.
Write by newfd.

注意:新旧文件描述符是共享文件读写位置。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值