dup()/dup2()函数使用

dup()函数

函数功能:

复制文件描述符;

函数原型

int dup(int oldfd);

oldfd --需要复制的文件描述符;

函数返回值

成功:返回最小且没有被占用的文件描述符;
失败:返回-1,设置error;

//测试dup函数复制文件描述符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(int argc, char *argv[])
{
	//打开文件
	int fd = open(argv[1], O_RDWR);
	if(fd<0)
	{
		perror("open error");
		return -1;
	}

	//调用dup函数复制fd
	int newfd = dup(fd);
	printf("newfd:[%d], fd:[%d]\n", newfd, fd);

	//使用fd对文件进行写操作
	write(fd, "hello world", strlen("hello world"));

	//调用lseek函数移动文件指针到开始处
	lseek(fd, 0, SEEK_SET);

	//使用newfd读文件
	char buf[64];
	memset(buf, 0x00, sizeof(buf));//将数组初始化;
	int n = read(newfd, buf, sizeof(buf));
	printf("read over: n==[%d], buf==[%s]\n", n, buf);

	//关闭文件
	close(fd);
	close(newfd);

	return 0;
}

[注]

当调用dup函数之后,newfd和fd都指向了同一个文件,内核会在内部维护一个计数,此时计数位2,当close一个文件描述符之后,这个计数变为1,只有当计数为0时,文件才会被真正关闭。
验证方法:通过fd对文件进行写操作,通过newfd对文件进行读操作。若读到文件内存则认定指向了相同文件。

dup2()函数

函数功能:

复制文件描述符;

函数原型

int dup2(int oldfd,int newfd);

oldfd --需要复制的文件描述符;
newfd --复制成的新的文件描述符

函数返回值

成功:将oldfd复制给newfd, 两个文件描述符指向同一个文件;
失败:返回-1,设置error;

[注]:

假设newfd已经指向了一个文件,首先close原来打开的文件,然后newfd指向oldfd指向的文件.

若newfd没有被占用,newfd指向oldfd指向的文件.

上一篇:重定向dup和dup2


下一篇:linux守护进程范例