dup&dup2函数的使用

linux:文件描述符重定向dup&dup2 ForeWord 本文介绍了对输入文件描述符重定向的函数dup&dup2,并用代码验证其功能。 ~**tips:全文阅读需5min**~Before 在没有duo&dup2,之前,要实现文件描述符重定向(输入)是这样做的:先关闭1号文件描述符,再打开文件完成重定向。 代码:运行:dup dup是系统提供的进行文件描述符重定向的接口: 其中: 1. odfd是当前文件描述符的一份拷贝 阅读详情

dup和dup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。

#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);

如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。

这里写图片描述

如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。

这里写图片描述

由dup返回的新文件描述符一定是当前可用文件描述符中的最小数值。对于dup2,可以用newfd参数指定新描述符的值。如果newfd已经打开,则先将其关闭。如若oldfd等于newfd,则dup2返回newfd,而不关闭它。

用dup和dup2实现重定向代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd, save_fd;
    char msg[] = "test file\n";

    fd = open("somefile", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
    if (fd < 0) {
        perror("open");
        exit(1);
    }   

    save_fd = dup(STDOUT_FILENO);
    dup2(fd, STDOUT_FILENO);
    close(fd);

    write(STDOUT_FILENO, msg, strlen(msg));
    dup2(save_fd, STDOUT_FILENO);

    write(STDOUT_FILENO, msg, strlen(msg));
    close(save_fd);

    return 0;
}

运行结果:

cat@lenovo:~/Pro/linux_sys/0720/dup2$ ./a.out 
test file
cat@lenovo:~/Pro/linux_sys/0720/dup2$ cat somefile
test file

过程分析:
这里写图片描述

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

相关推荐

Linux系统调用:dup与dup2详解及C语言实现

本文还有配套的精品资源,点击获取 简介:在Linux系统中, dup 和 dup2 是关键的系统调用,它们在文件描述符管理和进程间通信中发挥着重要作用。本文将解释这两个函数的工作原理和使用场景,并通过C语言示例展示如何实现。 dup 创建一个指向同一文件位置的新文件描述符,而 dup2 则允许指定新描述符的编号,使其功...

weixin_42668301的博客 2317

Linux dup()

dup() 是 Linux 中的一个系统调用,它的作用是复制一个文件描述符。 这个函数的原型是: #include <unistd.h> int dup(int oldfd); 它的参数是一个已经打开的文件描述符 oldfd,返回值是一个新的文件描述符。新的文件描述符指向与 oldfd 指向同一个文件,且两个文件描述符指向文件的偏移量也相同。 例如,假设你已经打开了一个文件,并且使用...

weixin_35751412的博客 439

抖音小游戏(IAA)巨量引擎投放指南

摘要:本文详细介绍了在巨量引擎平台投放小游戏广告的完整流程,包括五个关键步骤:1)添加小游戏资产,填写ID等信息并等待审核;2)添加事件管理,配置激活和关键行为事件;3)通过橙子建站创建落地页,设置跳转链接;4)新建广告项目,选择小程序推广目标;5)完成广告创建。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 4505

【linux】第四天 dup文件描述符复制函数和管道详解

管道(pipe)又称无名管道。 无名管道是一种特殊类型的文件,在应用层体现为 两个打开的文件描述符(读端和写端)。

m0_75045191的博客 1340

基于E310的纯逻辑代码实现AD9361射频收发

基于微相科技的E310平台实现AD9361的射频收发功能。采用纯逻辑控制的方式,不需要PS参与。实现了用VIO控制收发使能,发射功率,收发频率,数据接口时序控制,接收增益,BIST测试等功能。

xiaomingzi55的博客 2333

STM32L431电池供电项目实战:用STOP2模式把功耗降到5uA以下(CubeMX配置详解)

本文详细介绍了如何在STM32L431电池供电项目中利用STOP2模式实现5μA以下的超低功耗设计。通过CubeMX配置、硬件优化和软件策略,成功将农业温湿度监测节点的待机功耗控制在4.7μA,确保CR2032电池供电下3年以上的工作寿命。文章包含完整的低功耗实现路径和实测数据,特别适合物联网边缘设备开发者参考。

weixin_30345577的博客 395

Linux系统编程——dup() 重定向函数

这篇文章讲的是linux系统编程中的重定向函数,这个函数的作用是将一个文件描述符指向另一个文件描述符,有点像指针的作用,比如:fd2 指向 fd1,你改变 fd2 的文件内容,就可以直接改变fd1的内容,fd2是指向fd1的。

weixin_67452474的博客 2566

华大HC32F460 ADC+DMA高效数据采集实战解析

本文深入解析了华大HC32F460微控制器中ADC与DMA协同工作的高效数据采集方案。通过实战代码演示,详细阐述了如何配置硬件触发、序列扫描及AOS事件联动,实现后台自动采集,从而解放CPU资源,提升系统实时性与可靠性,适用于传感器数据采集、音频处理等多种场景。

weixin_29189373的博客 177

【Linux C | 文件I/O】文件共享、dup、dup2 函数

本文介绍Linux的文件共享,以及dup、dup2函数的介绍和使用场景、使用例子。

wkd_007的博客 2047

基于R语言的现代贝叶斯统计学方法(贝叶斯参数估计、贝叶斯回归、贝叶斯计算)实践

贝叶斯统计学是一门基本思想与传统基于频率思想的统计学完全不同的统计学方法;它以其灵活性和先进性在现代的统计学中占据着重要的地位。贝叶斯统计学是开展科学研究不可缺少的重要手段,但是,因为其思想、技术和方法都与传统统计学有着较大区别;且其计算中涉及马尔科夫、蒙特卡罗和吉布斯采样等现代计算方法,对使用者经验和能力构成了很大的挑战。

AAIshangyanxiu的博客 681

CentOS7下Ollama部署全攻略:从安装到自定义端口配置(附国内加速技巧)

本文详细介绍了在CentOS7系统上部署Ollama的完整流程,包括环境准备、模型下载优化、服务化部署及端口配置等关键步骤。特别针对国内网络环境提供了加速安装方案和镜像源配置技巧,帮助开发者快速搭建稳定的本地AI运行环境。

mmm90的博客 289

Linux系统下dup()函数的用法

dup函数简介 dup()和dup2()函数都可以用来复制一个文件描述符,其原型为 int dup(int oldfd); int dup2(int oldfd,int newfd); dup函数创建一个新的文件描述符,该新文件描述符和原文件描述符指向相同的文件、管道、或网络连接,dup返回的新文件描述符是取系统当前可用的最小整数值(一般情况下系统默认了标准输入0、标准输出1、标准出错2,在没有其他文件描述符的情况下,文件描述符fd的值为3,那么首次调用dup函数的返回值为4(3+1)) dup2函数和d

qq_46417372的博客 2902

AI奶牛TMR智能饲喂机器人 Qt信创完整项目( 统信/麒麟国产系统直接编译)

内置**犊牛、育成牛、围产牛、泌乳牛、干奶牛**5套标准化饲喂配方;+" 饲喂批次完成|牛群:"+grpText+"|投喂饲料:"+QString::number(ft)+"吨|剩料:"+QString::number(st)+"吨|异常牛:"+QString::number(abCow);cv::putText(frame,"霉变变质饲料禁止饲喂",cv::Point(20,40),cv::FONT_HERSHEY_SIMPLEX,0.7,cv::Scalar(0,0,255),2);

寒寒豆豆软件公司的博客 185

文件IO函数,dup&dup2&fcnlt

看了好几周,终于把apue的文件IO看完了。不管掌握的老不牢固,先在这里总结一下自己这些天的学习经验与收获。 首先是int open()函数,这个函数式打开或者创建一个文件。返回一个文件标示符,(PS: 系统默认运行时有三个文件标识符,0代表STDIN,1代表STDOUT,2代表ERROR这个很常用的三个,所以我谨记);文件标识符其实就是一个文件指针指向了一些和打开的当前文件有关的文件属性的数据

清章与Linux 328

禁止使用服务器 IP 访问 Apache 环境下的 Web 站点

通过在 Apache 的配置文件中添加适当的指令,我们可以轻松地禁止使用服务器 IP 地址访问我们的 Web 站点。在 Apache 环境下,有时我们希望禁止用户使用服务器的 IP 地址直接访问我们的 Web 站点,而只允许使用域名进行访问。现在,当用户尝试使用服务器的 IP 地址来访问你的网站时,他们将会被拒绝访问,只有通过域名才能正常访问。为了实现这个目标,我们可以通过 Apache 的配置文件进行相应的设置。表示禁止对根目录的访问权限,即禁止使用服务器的 IP 地址进行访问。

TpCode的博客 946

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Linux 常用C函数学习(一)——初级I/O函数

1. create:创建一个文件 2. open:打开一个文件 3. close:关闭已经打开的文件 4. write:输出内容到文件 5. read:读取文件的数据 6. dup & dup2:复制文件描述符(指定位置) 7. fcntl:改变文件的状态 8. fsync:将缓冲区数据写回到磁盘文件 9. Lseek:移动文件的读写位置 10. sync:将所有打开的文件写回磁盘 ...

再努力一点点就好了 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

文件描述符重定向---dup&dup2

dup和dup2都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的原形及描述如下: 输出重定向#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<fcntl.h> #include<string.h> int main(int argc,char *argv[]

scmuzi18的博客 385

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【Linux系统编程】文件_02_文件描述符fd_05_dup&dup2

【代码】【Linux系统编程】文件_02_文件描述符fd_05_dup&dup2。

m0_46301523的博客 268

Linux- dup()系统调用

dup()(duplicate)是一个UNIX系统调用,用于创建一个现有文件描述符的副本。这个新的文件描述符与原始文件描述符在许多方面是相同的:它们共享同一个文件表项,这意味着它们指向相同的文件、套接字或其他I/O通道,并共享相同的文件偏移量、访问权限等。

青衫客36的博客 1246

【Linux】dup、dup2函数

dup、dup2函数介绍

mhyasadj的博客 1471

dup函数详解

dup操作 功能:复制文件描述符,重定向输入输出。 函数: #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); 返回值: 成功:dup函数返回当前系统可用的最小整数值。 dup2函数返回第一个不小于newfd的整数值,分两种情况: 1. 如果newfd已经打开,则先将其关闭,再复制文件描述符; 2. 如果newfd等于oldfd,,则dup2函数返回newfd,而不关闭它。 失

weixin_42864391的博客 1万+

Linux应用编程之dup函数和dup2函数

在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限,譬如使用旧的文件描述符对文件有读写权限,那么新的文件描述符同样也具 有读写权限;在 Linux 系统下,可以使用 dup 或 dup2 这两个系统调用对文件描述符进行复制。我们来学习下两个函数的用法以及它们之间的区别。 复制得到的文件描述符与旧的文件描述符都指向了同一个文件表,.

shengnan89的博客 3074

Linux系统调用中的dup

n}\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\ndup2函数\ndup2函数是Linux系统API中的一员,它的作用是:将一个文件描述符指向的文件改为另一个文件描述符指向的文件。\n\n printf(\"fd的文件描述符是:%d,fd1的文件描述符是:%d\\n\",fd,fd1);

y632481222的博客 468

Linux 应用层开发入门(十二)| dup系列函数使用分析

Linux系统中的dup、dup2和dup3函数用于复制文件描述符,使不同句柄共享同一文件表项,包括偏移量和状态标志。dup返回最小可用描述符,dup2可指定目标描述符,常用于标准输入输出重定向,dup3增加了O_CLOEXEC等标志设置。这些函数在日志共享、管道通信和exec调用中发挥重要作用,使用时需注意文件描述符与FILE*的区别、避免泄漏以及共享偏移量的影响。合理运用这些函数能实现灵活的文件操作和进程通信。

嵌入式小程同学的博客 1404

linux c——dup( )和dup2( )函数详解

**dup用来复制参数oldfd所指的文件描述符。当复制成功是,返回最小的尚未被使用过的文件描述符 (*用语言描述可能不太清晰,以下面程序为例*)** #include<stdio.h> #include<sys/stat.h> #include<fcntl.h> #include<unistd.h> /* 已知0,1,2分别代表标准输入,标准输出,标准错误三个已经被系统占用。 */ int main(int argc, char* argv[]) {

qq_43404969的博客 471

Linux dup函数使用

linux中给目标文件分配一个新的文件描述符

比雅尼·斯特劳斯特鲁普(Bjarne Stroustrup)曾说过:如果你没看过这些博客,那么你的编程不会拥有智慧,你的代码不可能附有灵魂。 242
上一篇: open/close函数的使用
下一篇: 数组和字符串简单练习
Linux_forker
博客等级 码龄11年 3粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值