【linuxC语言】dup、dup2函数

文章目录

  • 前言
  • 一、dup函数
  • 二、dup2函数
  • 三、将标准输出重定向到文件
  • 总结


前言

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


一、dup函数

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

函数原型:

int dup(int oldfd);

示例代码:

#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函数

int dup2(int oldfd, int newfd);

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

示例代码:

#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函数把标准输出改成文件描述符即可

#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程序是非常重要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/442078.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Randoop 报错 Cannot find the Java compiler 的解决方案

编写测试用例是一项困难且耗时的工作&#xff0c;但同时又是好的软件工程的重要部分。Randoop是一个随机测试的测试用例生成的工具&#xff0c;能够自动的为Java代码中的类生成单元测试。 官网链接&#xff1a; https://randoop.github.io/randoop/manual/index.html。 正确的…

新手小白剪辑视频知识点:视频分辨率和位深度,有什么区别?

新手小白需要了解的视频剪辑知识点&#xff0c;什么是视频分辨率尺寸(文件大小)和位深度&#xff1f; 分辨率尺寸/文件大小 常见的视频分辨率是高清和 4K。高清素材的屏幕像素&#xff08;宽度 x 高度&#xff09;测量值通常为 1920 x 1080&#xff0c;而 4K 素材是其四倍&am…

【Linux通识】之端口到底是个什么?

端口的本质是计算机上的一小块内存&#xff01; 端口的概念 在Linux系统&#xff08;以及其他所有支持网络通信的操作系统&#xff09;中&#xff0c;端口&#xff08;Port&#xff09;可以理解为计算机在网络上与外界沟通的虚拟通道或门牌号码。当我们谈论网络通信时&#xf…

【教程】Github环境配置新手指南(超详细)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 文章目录 一、Github初始设置&#xff08;一&#xff09;登入Github&#xff08;二&#xff09;新建仓库 二、本地Git配置&am…

在Leaflet中使用Turf.js生成范围多边形的两种实现方式

目录 前言 一、场景需求 1、Leaflet.js的不足 2、Turf.js 二、原始数据展示 1、点位数据展示 2、定义样式 3、定位数据初始化 三、Turfjs中bbox生成 1、官网讲解 2、轨迹bbox生成 四、Turfjs生成外包多边形 1、官网例子 2、凸多边形生成 总结 前言 在一些共享出…

机器学习--循环神经网路(RNN)2

在这篇文章中&#xff0c;我们介绍一下其他的RNN。 一.深层RNN 循环神经网络的架构是可以任意设计的&#xff0c;之前提到的 RNN 只有一个隐藏层&#xff0c;但 RNN 也可以是深层的。比如把 xt 丢进去之后&#xff0c;它可以通过一个隐藏层&#xff0c;再通过第二个隐藏层&am…

三  超级数据查看器   讲解稿    主界面和系统功能介绍

三 超级数据查看器 讲解稿 主界面和系统功能介绍 APP百度下载地址 下载地址4 ​讲解稿全文: 大家好。 今天我们讲解一下&#xff0c;超级数据查看器主界面。 首先&#xff0c;我们打开超级数据查看器。 打开之后&#xff0c;进入的第一个界面就是主界面。这个页面由三…

网络编程---网络编程入门、UDP通信程序、TCP通信程序

1.网络编程入门 1.网络编程概述 网络编程&#xff1a; 在网络通信协议下&#xff0c;实现网络互连的不同计算机上运行的程序间可以进行数据传输 计算机网络&#xff1a; 是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#…

docker安装ES、LogStash、Kibana

文章目录 一、安装Elasticsearch1. 安装Elasticsearch2. 安装IK分词器3. elasticsearch-head 监控的插件4. 配置跨域 二、安装LogStash三、安装kibana四、SpringBoot集成LogStash&#xff0c;将日志输出到ES中五、 启动项目&#xff0c;监控项目运行 提示&#xff1a;以下是本篇…

ABAP接口部分-C#调用RFC

目录 ABAP接口部分-C#调用RFC创建表结构创建RFC函数创建C#项目引用SAP .Net Connector包绘制窗口的控件最终布局代码 项目配置报错SAP.Middleware.Connector.RfcDestinationManager报错SAP.Middleware.Connector.RfcLoginexception报错SAP.Middleware.Connector.RfcInvalidStat…

Docker基础教程 - 8 镜像仓库

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 8 镜像仓库 在安装 Docker 的时候&#xff0c;默认使用的是 DockerHub&#xff0c;后来为了提升速度&#xff0c;配置的镜像仓库是使用阿里云的镜像仓库&#xff0c;拉取的是别人制作的镜像&…

第五十三回 入云龙斗法破高廉 黑旋风下井救柴进-AI训练数据处理和读取

罗真人教了公孙胜五雷天罡正法&#xff0c;并让他记住“逢幽而止&#xff0c;遇汴而环”八个字。三人辞别了罗真人&#xff0c;戴宗先回去报信&#xff0c;李逵和公孙胜结伴而行。 走了三天&#xff0c;来到了武冈镇&#xff0c;李逵碰到一个铁匠&#xff0c;叫金钱豹子汤隆&a…

[Flutter get_cli] 配置 sub_folder:false报错

flutter get_cli 配置 get_cli:sub_folder:false报错如下 Because getx_cli_learn01 depends on get_cli from unknown source "sub_folder", version solving failed. 原因是在 pubspec.yaml文件中, get_cli:sub_folder:false要和 dependencies: xxx dev_depe…

【node版本问题】运行项目报错 PostCSS received undefined instead of CSS string

最近该项目没有做任何修改&#xff0c;今天运行突然跑不起来报错了 PostCSS received undefined instead of CSS string 【原因】突然想起来期间有换过 node 版本为 16.17.1 【解决】将 node 版本换回之前的 14.18.0 就可以了

突然发现一个很炸裂的平台!

平时小孟会开发很多的项目&#xff0c;很多项目不仅开发的功能比较齐全&#xff0c;而且效果比较炸裂。 今天给大家介绍一个我常用的平台&#xff0c;因含低代码平台&#xff0c;开发相当的快。 1&#xff0c;什么是低代码 低代码包括两种&#xff0c;一种低代码&#xff0c;…

正则表达式 || 遇到字符串里面有() 就在括号后面换行

<template><div class"vertical-layout"><header><h1>testPage</h1><p>(1)第一行内容xxxxxxxxx&#xff08;2&#xff09;第二行内容xxxxxxx(3)第三行内容</p></header><main><el-button click"goToO…

IPsec

在FW5和FW3之间建立一条IPSEC通道,保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 最后测试&#xff1a;

xpath和lxml类库

数据提取之xpath 学习目标 了解 html和xml的区别掌握 xpath获取节点属性的方法掌握 xpath获取文本的方法掌握 xpath查找特定节点的方法 1. 为什么要学习xpath和lxml lxml是一款高性能的 Python HTML/XML 解析器&#xff0c;我们可以利用XPath&#xff0c;来快速的定位特定元…

linux centos系统搭建samba文件服务器 NetBIOS解析 (超详细)

CSDN 成就一亿技术人&#xff01; 作者主页&#xff1a;点击&#xff01; Linux专栏&#xff1a;点击&#xff01; CSDN 成就一亿技术人&#xff01; 前言———— Samba 是一个开源软件套件&#xff0c;可为 SMB/CIFS 客户端&#xff08;包括 Windows&#xff09;提供文件…

为什么选择Copilot for Microsoft365而不是Copilot Pro

最近很多小伙伴都用上了copilot&#xff0c;开始感受copilot在生产力工具中发挥的作用与带来的提升。 询问比较多的就是商业企业版的Copilot for Microsoft 365和个人家庭版的Copilot Pro有什么区别&#xff1f; 这篇文章一定会让你在两者之间选择最合适你的那个。 一、价格…