dup()与dup2()的浅析

本文详细解析了Linux系统编程中的dup()和dup2()函数,通过实例演示如何重定向stdin和理解它们与open(), close()的关系。特别介绍了dup2()的用法,以及其与close()和dup()的区别,适合系统程序员和进阶学习者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  • 关于dup()和dup2()的使用在Linux系统编程中是十分重要的一环,但关于dup2()的使用总有一种雾蒙蒙的感觉,本文会从dup()说起,希望可以带领大家走过迷雾
  • 文中代码片中代码仅供逻辑参考
  • 因本人水平有限,若文中有何纰漏,恳请各位斧正

定义

  • 在这里插入图片描述

详解

  • dup()的使用与open(),close()函数的联系十分密切
  • 思考一下,我们如何完成将stdin重定向至文件

close then open

  • 在使用dup()前,我们可以利用“最低可用文件描述符”原理来完成一次小实验
  • 最低可用文件描述符:Lowest-Available-Fd
  • 思考一下,我们如何利用上述原则来完成将stdin重定向至文件
    • 第一步:使用close(0),将标准输入与终端设备的连接切断
    • 第二步:使用open(somefile, R_RDONLY)来打开一个文件
    • 由于此时最低可用文件描述符为0,所以上一步骤所打开的文件将被连接到标准输入上去
int fd;

close(0);
fd = open("/exc/passwd", O_RDONLY);

open - close - dup -close

  • 系统调用dup()建立指向已经存在的文件描述符第二个连接
  • 四个步骤:
    • open(file): 打开想要重定向的文件
    • close(0)
    • dup(fd):复制文件描述符fd,此次复制使用最低可用文件描述符,在此处即为0,此时文件就已经与文件描述符0连接至一起了
    • close(fd):关闭文件的原始连接,只留下与文件描述符0的连接
      在这里插入图片描述
int fd;
int newfd;

fd = open("/etc/passwd",R_RDOMLY);
close(0);
newfd = dup(fd);//newfd 的值即为0
close(fd);

open - dup2 - close

  • dup2()的man手册定义:
    在这里插入图片描述
  • dup2()用来替换close(0)和dup(fd)
  • dup2(old,new)将文件描述符old复制到文件描述符new,在此之前它先将文件描述符new上已经存在的连接关闭
int fd;
int newfd;

fd = open("/etc/passwd",R_RDOMLY);
//close(0);
//newfd = dup(fd);//newfd 的值即为0
newfd = dup2(fd,0);
close(fd);

参考:

  • 《Unix-Linux编程实践教程》
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值