【linuxC语言】dup、dup2函数

文章目录


前言

在Linux环境下,dup、dup2以及原子操作都是用于文件描述符管理和处理的重要工具。这些功能提供了对文件描述符进行复制和原子操作的能力,使得在多线程或多进程环境中更加安全和高效地进行文件操作。


一、dup函数

dup 函数通过复制参数 oldfd 所指向的文件描述符来创建一个新的文件描述符。新的文件描述符是系统中未使用的最小文件描述符。它与 oldfd 指向同一文件表项,共享相同的文件偏移量和文件状态标志。如果 dup 调用成功,它会返回新的文件描述符,如果失败则返回 -1,并设置 errno 来指示错误原因。

函数原型:

c 复制代码
int dup(int oldfd);

示例代码:

c 复制代码
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main() {
    int fd = open("file.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    int new_fd = dup(fd);
    if (new_fd == -1) {
        perror("dup");
        close(fd);
        return 1;
    }

    printf("Original file descriptor: %d\n", fd);
    printf("Duplicated file descriptor: %d\n", new_fd);

    close(fd);
    close(new_fd);

    return 0;
}

二、dup2函数

c 复制代码
int dup2(int oldfd, int newfd);

dup2 函数与 dup 类似,但是它允许将新的文件描述符指定为 newfd。如果 newfd 已经打开,则先关闭它。如果 oldfd 等于 newfd,则 dup2 不会关闭 newfd。如果调用成功,dup2 返回新的文件描述符,如果失败则返回 -1,并设置 errno 来指示错误原因。

示例代码:

c 复制代码
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>

int main() {
    int fd = open("file.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    int new_fd = 10; // New file descriptor
    if (dup2(fd, new_fd) == -1) {
        perror("dup2");
        close(fd);
        return 1;
    }

    printf("Original file descriptor: %d\n", fd);
    printf("Duplicated file descriptor: %d\n", new_fd);

    close(fd);
    // No need to close new_fd as it's now pointing to the same file as fd

    return 0;
}

三、将标准输出重定向到文件

使用dup2函数把标准输出改成文件描述符即可

c 复制代码
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main() {
    // 打开一个文件,用于重定向
    int file_fd = open("test.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (file_fd == -1) {
        perror("open");
        return 1;
    }

    // 备份标准输出文件描述符
    int stdout_backup = dup(STDOUT_FILENO);
    if (stdout_backup == -1) {
        perror("dup");
        return 1;
    }

    // 将标准输出重定向到文件描述符
    if (dup2(file_fd, STDOUT_FILENO) == -1) 

        perror("dup2");
        return 1;
    }

    // 现在printf会将内容输出到文件
    printf("This will be redirected to the file.\n");

}

总结

通过本文的介绍,我们了解到在Linux环境下,dup、dup2以及原子操作在文件描述符管理和处理中扮演着重要的角色。它们提供了对文件描述符进行复制和原子操作的功能,使得文件操作更加灵活、高效和安全。深入理解并熟练掌握这些功能,对于编写高性能、可靠的Linux程序是非常重要的。

相关推荐
charlie11451419125 分钟前
嵌入式Linux驱动开发——新 API 字符设备驱动完整教程 - 从设备结构体到应用测试
linux·运维·驱动开发
TE-茶叶蛋31 分钟前
深入研究 yudao-framework 模块:Java 编程能力提升指南
java·开发语言
CHANG_THE_WORLD36 分钟前
C语言中的 %*s 和 %.*s 和C++的字符串格式化输出
c语言·c++·c#
逻辑驱动的ken40 分钟前
Java高频考点场景题24
java·开发语言·面试·职场和发展·求职招聘
飞Link1 小时前
2000 亿砸向算力:字节跳动 AI 基建跨越,后端与运维的“万亿 Token”生死战
运维·人工智能
兔小盈1 小时前
多线程-(五)线程安全之内存可见性
java·开发语言·多线程
消失的旧时光-19431 小时前
C语言对象模型系列(四)《Linux 内核里的 container_of 到底是什么黑魔法?》—— 一篇讲透 Linux 内核的“对象模型”核心技巧
linux·c语言·算法
SWAGGY..1 小时前
Linux系统编程:(二)基础指令详解
linux·运维·服务器
yaoxin5211231 小时前
400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件
java·开发语言·python
kdxiaojie2 小时前
U-Boot分析【学习笔记】(3)
linux·笔记·学习