linux重定向函数dup、dup2函数

dup函数:

函数描述: 复制文件描述符
函数原型: int dup(int oldfd);
函数参数: oldfd -要复制的文件描述符
函数返回值:
成功: 返回最小且没被占用的文件描述符
失败: 返回-1, 设置errno值

测试用例:创建dup.c函数

//测试dup函数复制文件描述符,通过open返回的文件描述符进行写操作,dup复制的文件描述符进行读操作。
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

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, "ni hao", strlen("ni hao"));

	//调用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函数比较简单,结果如下:

linux重定向函数dup、dup2函数

dup2函数:

函数描述: 复制文件描述符

函数原型: int dup2(int oldfd, int newfd);

函数参数: 
oldfd-原来的文件描述符
newfd-复制成的新的文件描述符

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

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

举例:创建dup2_test.c 文件夹,下入如下代码

//将print输出重定向到文件中
#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s \n", argv[0]);
        return EXIT_FAILURE;
    }

    // 打开文件
    int fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0644); // 更改权限为644
    if (fd < 0) {
        perror("open error");
        return EXIT_FAILURE;
    }

    // 调用dup2函数实现文件重定向操作
    if (dup2(fd, STDOUT_FILENO) < 0) {
        perror("dup2 error");
        close(fd); // 确保即使出错也关闭fd
        return EXIT_FAILURE;
    }

    printf("ni hao hello world\n"); // \n可以使得缓冲区立即刷新

    close(fd); 

    return EXIT_SUCCESS;
}

结果如下:
linux重定向函数dup、dup2函数

上一篇:c1是手动挡还是自动挡(c1是自动挡还是手动挡)
下一篇:oppok3好不好用(oppok3二手值不值得买)