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.

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


版权声明:本文为weixin_42864391原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42864391/article/details/108799901