【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 descriptorif (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 fdreturn 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程序是非常重要的。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10大主流压力/负载/性能测试工具推荐

在移动应用和Web服务正式发布之前&#xff0c;除了进行必要的功能测试和安全测试&#xff0c;为了保证互联网产品的服务交付质量&#xff0c;往往还需要做压力/负载/性能测试。然而很多传统企业在试水互联网的过程中&#xff0c;往往由于资源或产品迭代速度等原因忽视了这一块工…

整屋案例丨福州府108m²3室2厅2卫轻奢有度,高级耐看。福州中宅装饰,福州装修

空间之间的空间 比空间本身更具有意味&#xff0c; 但也容易被忽略&#xff0c; 正是由于“之间”的多元性和复杂性 以及它的不确定性&#xff0c; 空间之间变得无限可能。 平面设计图 项目信息 项目名称 | 福州府 设计地址 | 福建福州 项目面积 | 108㎡ 项目户型 | …

【JavaEE初阶】 JVM类加载简介

文章目录 &#x1f343;前言&#x1f332;类加载过程&#x1f6a9;加载&#x1f6a9;验证&#x1f6a9;准备&#x1f6a9;解析&#x1f6a9;初始化 &#x1f384;双亲委派模型&#x1f6a9;什么是双亲委派模型&#xff1f;&#x1f6a9;双亲委派模型的优点 ⭕总结 &#x1f343…

程序运行的基本流程

操作系统&#xff08;应用程序&#xff09;&#xff1a; 装系统就是将操作系统安装到硬盘1中 计算机启动的基本过程&#xff1a; 总结&#xff1a; 程序一般保存在硬盘中&#xff0c;软件安装的过程就是将程序写入硬盘的过程程序在运行时会加载进入内存&#xff0c;然后由CPU…

Alveo U200 和 U250 数据中心加速器卡硬件原理图

U200原理图中的一些重要组件和接口如下&#xff1a; QSFP (Quad Small Form-factor Pluggable)&#xff1a;QSFP 是一种高速网络连接器&#xff0c;可支持 40GbE/100GbE 等数据传输速率。在 U200 中&#xff0c;QSFP 用于与外部设备进行高速网络通信。 闪存&#xff1a;闪存是…

【Python】6. 基础语法(4) -- 列表+元组+字典篇

列表和元组 列表是什么, 元组是什么 编程中, 经常需要使用变量, 来保存/表示数据. 如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可. num1 10 num2 20 num3 30 ......但是有的时候, 代码中需要表示的数据特别多, 甚至也不知道要表示多少个数据. 这个时候,…

重磅发布|AutoMQ 1.0.0 GA 版本官宣:已验证生产环境可用性

AutoMQ 是基于云构建的无服务、极速弹性、极具成本效益的下一代 Kafka。100%兼容Apache Kafka&#xff0c;无分区数据复制。在无副作用的前提下解决了 Kafka 弹性、运维上的诸多痛点并且带来了数量级的成本降低。 AutoMQ 1.0.0 GA 版本现已在 Github 仓库 (https://github.com…

tcp服务器客户端通信(socket编程)

目录 1.编程流程 2.代码演示 2.1 服务器代码 2.2 客户端代码 3.注意 3.1 ping命令 3.2 netstat命令 3.3 为什么memset? 3.4 哪个会阻塞? 3.5 显示连接信息 1.编程流程 2.代码演示 2.1 服务器代码 #include <stdio.h> #include <stdlib.h> #include <…

Logseq电脑端+安卓端同步gitee或github

文章目录 0.初衷1.电脑端1.1 新建仓库1.2 克隆项目&#xff0c;生成秘钥1.3 添加图谱&#xff0c;选择文件目录&#xff0c;我是原本就有笔记&#xff0c;所以会如下所示。1.4 下载脚本文件1.5赋权限 &#xff08;windows可跳过&#xff09;1.6 修改脚本命令1.7 logseq设置同步…

Docker-完整项目的部署(保姆级教学)

目录 1 手动部署(白雪版) 1.1 创建网络 1.2 MySQL的部署 1.2.1 准备 1.2.2 部署 1.3 Java项目的部署 1.3.1 准备 1.3.1.1 将Java项目打成jar包 1.3.1.2 编写Dockerfile文件 1.3.2 部署 1.3.2.1 将jar包、Dockerfile文件放在linux同一个文件夹下 1.3.2.2 构建镜像 …

C# 用Trace.WriteLine输出调试信息无法查看

写程序就会遇见BUG&#xff0c;这时候在代码不同部位输出一些标记的信息对查找错误非常有必要&#xff0c;一般情况下我们都是使用Console.WriteLine()方法来打印信息到控制台窗口&#xff0c;但有时候使用Console.WriteLine()方法会存在不方便的情况&#xff0c;比如鄙人遇到的…

tomcat优化与部署(三)------nignx优化与nginx +tomcat 部署

在目前流行的互联网架构中&#xff0c;Tomcat在目前的网络编程中是举足轻重的&#xff0c;由于Tomcat的运行依赖于JVM&#xff0c;从虚拟机的角度把Tomcat的调整分为外部环境调优 JVM 和 Tomcat 自身调优两部分 Tomcat 是一个流行的开源 Java 服务器&#xff0c;用于托管 Java …

弱电综合布线:连接现代生活的纽带

在当今信息化快速发展的时代&#xff0c;弱电网络布线作为信息传输的重要基础设施&#xff0c;其作用日益凸显。它不仅保障了数据的高效流通&#xff0c;还确保了通信的稳定性。从商业大厦到教育机构&#xff0c;从政府机关到医院急救中心&#xff0c;再到我们居住的社区&#…

十五、抽象类与接口

抽象类与接口 solid设计原则 五个基本设计原则的首字母&#xff0c;然后通过这五种基本的设计原则&#xff0c;衍生出很多种的设计模式 抽象类 就是五个基本设计原则当中的o即open or close 某些软性规则需要服从&#xff0c;不然就会给自己或者他人带来麻烦 抽象类&#xff…

动态代理详解

动态代理 一、JDK动态代理二、CGLIB动态代理三、Javassist动态代理技术 在程序运行阶段&#xff0c;在内存中动态生成代理类&#xff0c;被称为动态代理&#xff0c;目的是为了减少代理类的数量。解决代码复用的问题。 一、JDK动态代理 DK动态代理技术&#xff1a;只能代理接口…

如何做代币分析:以 ARB 币为例

作者&#xff1a;lesleyfootprint.network 编译&#xff1a;mingfootprint.network 数据源&#xff1a;ARB 代币仪表板 &#xff08;仅包括以太坊数据&#xff09; 在加密货币和数字资产领域&#xff0c;代币分析起着至关重要的作用。代币分析指的是深入研究与代币相关的数据…

代码随想录算法训练营第三天|203.移除链表元素

题目&#xff1a; 203. 移除链表元素 已解答 简单 相关标签 相关企业 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val …

MySQL 存储过程(超详细)

一、什么是存储过程&#xff1f; 存储过程可称为过程化SQL语言&#xff0c;是在普通SQL语句的基础上增加了编程语言的特点&#xff0c;把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中&#xff0c;通过逻辑判断、循环等操作实现复杂计算的程序语言。换句话说&#xff0c…

K倍区间(蓝桥杯)

文章目录 K倍区间题目描述前缀和数学优化代码部分解释 K倍区间 题目描述 给定一个长度为 N的数列&#xff0c;A1,A2,…AN&#xff0c;如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K的倍数&#xff0c;我们就称这个区间 [i,j]是 K倍区间。 你能求出数列中总共有多少个 K倍区…

上海雷卯可以解决YPbPr/ YCbCr接口 ESD/EOS静电浪涌问题

YPbPr /YCbCr 接口传输的是视频信号&#xff0c;不传输音频信号。YPbPr 和 YCbCr 都是视频信号的颜色编码格式&#xff0c;多应用于机顶盒&#xff08;Set-top box&#xff09;,TV电视&#xff0c;投影仪&#xff0c;游戏机和DVD播放器。 YPbPr&#xff1a;是一种模拟视频接口…