函数dup和dup2

article/2025/10/1 10:59:59

这两个函数包含在#include<unistd.h>之中。他们都是用来复制一个现有的文件描述符。

函数原型

函数功能:若成功返回新的文件描述符,否则返回-1,并且dup返回的文件描述符一定是当前可用文件描述符中最小的。

dup2可以用newfd指定新描述符。若newfd已经打开,那么先将其关闭。若oldfd==newfd,那么返回newfd,不关闭它。这些返回的新文件描述符与参数oldfd指向同一个文件表,新的文件描述符的关闭操作总是由dup函数清除的。

一个进程内dup和dup2函数执行以后内核的数据结构如上图所示。文件描述符指向的是同一个文件表。也拥有相同的文件偏移量。下面是一个简单的实例。

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{//打开文件int fd = open("./1.txt",O_RDWR|O_APPEND|O_TRUNC);if (-1  == fd){perror("Open Failed");exit(-1);}//复制文件描述符int newfd = dup(fd);//写入文件int len;int size = write(fd,"Hello World!\n",len = strlen("Hello World!\n"));if (-1 == size){perror("Write Failed");exit(-1);}//读取文件并打印char str[50] = {0};lseek(fd,0,SEEK_SET);size = read(fd,str,len);printf("%s",str);    //从复制的文件描述符读取文件并打印。size = read(newfd,str,len);printf("%s",str);return 0;
}

运行结果如下。

 

运行结果表明复制以后的文件描述符和原本的文件描述符拥有相同的文件偏移量,这就能够说明他们确实索引的是同一个文件表项。

dup和dup2常用在需要创建子进程的进程中。举个例子,将当前的环境变量保存到一个文件之中。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>int main(int argc,char *argv[])
{int statu;int fd = open("./env.txt",O_WRONLY | O_TRUNC| O_CREAT,0664);if(-1 == fd){perror("open fial");exit(1);}if(-1 == dup2(fd,STDOUT_FILENO))     //指定新的文件描述符是标准输出。{perror("dup fail");exit(1);}pid_t pid = fork();if (0 == pid){execl("/usr/bin/env","env",NULL);      //启动env程序exit(0);}else if (0 < pid){wait(&statu);       //等待子进程结束,并获取结束状态//打开标准输出设备,否则后面的printf无法打印到屏幕。fd = open("/dev/tty",O_RDWR,0664);dup2(fd,STDOUT_FILENO);         //复制fd.if(0 == WEXITSTATUS(statu)){printf("已经成功将当前用户环境变量保存到文件env.txt中。\n");}}else{perror("fork fail");exit(1);}return 0;
}

运行结果如下:

通过shell命令env的输出结果成功保存到了env.txt中。


http://chatgpt.dhexx.cn/article/1FRglM2b.shtml

相关文章

dup2使用

头文件&#xff1a; 参数&#xff1a; dup2是帮助我们进行重定向的系统调用接口 使用方法&#xff1a;把fd_arrays[oldfd]拷贝到fd_arrays[newfd]&#xff0c;实现重定向 原理&#xff1a; 要会使用dup2&#xff0c;要先了解文件描述符fd 文件描述符 下面这段代码就是不调用…

重定向dup和dup2

dup和dup2 返回值是int的文件描述符&#xff0c;参数是已有的文件描述符 此时打印的文件描述符为4&#xff0c;使用这个文件描述符可以访问打开的文件&#xff0c;可以通过这个往新的文件描述符写&#xff0c;主只需把打开方式改成可读可写即可。 dup2&#xff1a; 注意两个指针…

dup dup2 fcntl函数

dup函数 dup函数&#xff1a;用来复制文件描述符 函数原型&#xff1a; int dup(int oldfd);//oldfd为要复制的文件描述符 成功返回最小且没被占用的文件描述符,失败返回-1 dup函数复制的文件描述符与原文件描述符指向同一个文件 //测试dup函数复制文件描述符 #include <std…

【Linux】dup、dup2函数

目录 dup函数dup2函数 橙色 dup函数 int dup(int oldfd); //复制文件描述符 /*#include <unistd.h>int dup(int oldfd);作用&#xff1a;复制一个新的文件描述符fd3, int fd1 dup(fd),fd指向的是a.txt, fd1也是指向a.txt从空闲的文件描述符表中找一个最小的&#xff…

dup、dup2介绍

dup和dup2也是两个非常有用的调用&#xff0c;它们的作用都是用来复制一个文件的描述符。它们经常用来重定向进程的stdin、stdout和stderr。这两个函数的 原形如下&#xff1a;#include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd ) …

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

在 Linux 系统中&#xff0c; open 返回得到的文件描述符 fd 可以进行复制&#xff0c;复制成功之后可以得到一个新文件描述符&#xff0c;使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作&#xff0c;复制得到的文件描述符和旧的文件描述符拥有相同的权限&…

linux文件重定向 dup,linux之dup和dup2函数解析

linux之dup和dup2函数解析 linux之dup和dup2函数解析 系统调用dup和dup2能够复制文件描述符。dup返回新的文件文件描述符(没有用的文件描述符最小的编号)。dup2可以让用户指定返回的文件描述符的值&#xff0c;如果需要&#xff0c;则首先接近newfd的值&#xff0c;他通常用来重…

dup和dup2函数

dup和dup2函数 dup和dup2用于复制文件描述符&#xff0c;通常用于重定向。 #include <unistd.h>int dup(int oldfd); int dup2(int oldfd, int newfd);dup函数创建一个新的文件描述符&#xff0c;该新文件描述符和原有文件描述符oldfd指向相同的文件、管道或者网络连接…

重定向(dup、dup2、dup3)--Linux

文章目录 &#x1f6a9;重定向是什么&#xff1f;&#x1f6a9;dup系列函数实现重定向&#x1f341;dup&#x1f341;dup2&#x1f341;dup3 &#x1f6a9;总结 &#x1f6a9;重定向是什么&#xff1f; 在上篇博客[文件描述符]中我曾提到了一个有意思的证明&#xff1a;进程在…

协议篇————3、DUP协议详解

一、UDP协议简介 UDP是OSI模型中一种无连接的传输层协议&#xff0c;它主要用于不要求分组顺序到达的传输中&#xff0c;分组传输顺序的检查与排序由应用层完成&#xff0c;提供面向事务的简单不可靠信息传送服务。UDP 协议基本上是 IP协议与上层协议的接口。UDP协议适用端口分…

8086汇编语言dup指令学习

dup是duplicate的缩写&#xff0c;重复的意思&#xff1b; 用来定义重复的字节、字、双字、结构等内存缓冲区&#xff1b; db x dup()&#xff0c;x是重复的次数&#xff0c;&#xff08;&#xff09;里是要重复的数&#xff0c;逗号分隔&#xff1b; db 重复的次数 dup &…

文件描述符的复制(dup)

1.dup和dup2函数的介绍 int dup(int oldfd); 返回一个文件描述符&#xff0c;参数是要复制的那个文件描述符。2.使用dup进行文件描述符的复制 &#xff08;1&#xff09;dup系统调用对fd进行复制&#xff0c;会返回一个新的文件描述符&#xff0c;&#xff08;譬如原来的是3&a…

java面试题库app

java面试题库app是一款专为正在找工作的java程序员打造的软件&#xff0c;这款软件集合了精选的Java面试笔试题目及答案&#xff0c;致力于帮助用户通过面试和笔试&#xff0c;有需要的朋友快来下载吧。 java面试题库app特色 1、java基础(全面的java基础面试题&#xff0c;jav…

java-题库

java-题库 一、hashMap的底层实现1.1、hashMap概述1.2、JDK1.7-扩容源码1.3、JDK1.7链表迁移过程1.4、JDK1.8下的扩容机制 二、java面向对象的三大特征三、JVM相关四、集合相关五、JDK1.8新特性5.1、接口内可以添加非抽象的方法实现5.2、Lambda表达式5.3、函数式接口5.4、Strea…

Java二级考试题库

1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 11、 12、 13、 14、 15、 16、 17、 18、 19、 20、 21、 22、 23、 24、 25、 26、 27、 注意&#xff1a;&#xff08;1&#xff09;基本型数据变量传递的是数值&#xff0c;修改会直接影响数据&#xff1b;而引用型变量传递的是…

java基础_题库详解

删除线格式 # 1 JDK和JRE有什么区别&#xff1f; JRE&#xff1a;Java Runtime Environment&#xff08; java 运行时环境&#xff09;。即java程序的运行时环境&#xff0c;包含了 java 虚拟机&#xff0c;java基础类库。 JDK&#xff1a;Java Development Kit&#xff08; ja…

Java笔试题

随机从1到100000中间随机取出100个不同的质数&#xff0c;然后按从小到大的顺序排列 public class IsPrime { //工具类// 输入一个数,判断是否为质数,费时方法public static Integer isPrime(int num) {if (num 0 || num 1)return -1;for (int i 2; i < num - 1; i) {if …

Java期末题库

根据如下图所示数据库信息&#xff0c;完成1-3小题。 &#xff08;1&#xff09;使用JDBC数据库连接技术&#xff0c;编写JDBCUtil工具类&#xff0c;在该类中定义getCon方法用于获得与数据库的连接对象&#xff0c;定义closeAll方法用于释放连接对象等资源。 import java.sql…

2022史上最全java面试题题库大全800题含答案

2022史上最全java面试题题库大全800题含答案 1、 meta标签的作用是什么 2、 ReenTrantLock可重入锁&#xff08;和synchronized的区别&#xff09;总结 3、 Spring中的自动装配有哪些限制&#xff1f; 4、 什么是可变参数&#xff1f; 5、 什么是领域模型(domain model)&#…

全国计算机等级考试——二级JAVA完整大题题库【五十三道】

全国计算机等级考试二级 JAVA 题目内容 编写于2023.04.10 分为40道选择题和3道大题&#xff08;大题是程序填空类型&#xff09; 其中选择题只能进去做一次&#xff0c;一旦退出来则不可再进&#xff08;注意&#xff01;&#xff09;。大题可以重复进入&#xff0c;重复做。…