dup dup2 fcntl函数

article/2025/10/1 11:30:16

dup函数

dup函数:用来复制文件描述符

函数原型:

int dup(int oldfd);//oldfd为要复制的文件描述符

成功返回最小且没被占用的文件描述符,失败返回-1

dup函数复制的文件描述符与原文件描述符指向同一个文件

//测试dup函数复制文件描述符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, char *argv[])
{//打开文件int fd = open(argv[1], O_RDWR);if(fd<0){perror("open error");return -1;}//调用dup函数复制fdint newfd = dup(fd);printf("newfd:[%d], fd:[%d]\n", newfd, fd);//使用fd对文件进行写操作write(fd, "hello world", strlen("hello world"));//调用lseek函数移动文件指针到开始处lseek(fd, 0, SEEK_SET);//使用newfd读文件char buf[64];memset(buf, 0x00, sizeof(buf));int n = read(newfd, buf, sizeof(buf));printf("read over: n==[%d], buf==[%s]\n", n, buf);//关闭文件close(fd);close(newfd);return 0;
}

dup2函数

dup2函数也用来复制文件描述符

函数原型:

int dup2(int oldfd,int newfd);//oldfd 原来的文件描述符 newfd复制成的新的文件描述符

函数返回值:

成功: 将oldfd复制给newfd, 两个文件描述符指向同一个文件

失败: 返回-1, 设置errno值

假设newfd已经指向了一个文件,首先close原来打开的文件,然后newfd指向oldfd指向的文件.

若newfd没有被占用,newfd指向oldfd指向的文件.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<fcntl.h>
int main(int argc,char *argv[])
{//打开一个文件int oldfd = open(argv[1],O_RDWR | O_CREAT,0755);if(oldfd<0){perror("open error");return -1;}//打开一个新文件int newfd = open(argv[2],O_RDWR | O_CREAT, 0755);dup2(oldfd,newfd);//复制一个文件描述符,使两个文件描述符指向同一个文件//使用oldfd进行写操作write(oldfd,"hello world",strlen("hello world"));//使用复制的文件描述符进行读操作//如果能读到文件表明两个文件描述符指向同一个文件lseek(oldfd,0,SEEK_SET);char buf[64];memset(buf,0x00,sizeof(buf));int n = read(newfd,buf,sizeof(buf));printf("n==%d buf == %s\n",n,buf);close(oldfd);close(newfd);return 0;}

dup函数和dup2函数图解

当调用dup函数之后,newfd和fd都指向了同一个文件test.log,内核会在内部维护一个计数,此时计数为2,当close一个文件描述符之后,这个计数就变为1,只有当计数为0时,文件才会真正被关闭。

当调用dup2函数之后,若newfd原来已经打开了一个文件,则先关闭这个文件,然后newfd指向了和oldfd相同的文件;

若newfd原来没有打开文件,则newfd直接指向oldfd相同的文件。

调用dup2函数之后,内核会修改内部的计数,计数为2。

dup2实现文件重定向

//使用dup2函数实现标准输出重定向操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, char *argv[])
{//打开文件int fd = open(argv[1], O_RDWR | O_CREAT, 0777);if(fd<0){perror("open error");return -1;}//调用dup2函数实现文件重定向操作dup2(fd, STDOUT_FILENO);printf("ni hao hello world");close(fd);close(STDOUT_FILENO);return 0;
}

fcntl函数

改变已经打开的文件的属性

函数原型:

int fcntl(int fd,int cmd,.../*arg*/);

若cmd为F_DUPFD, 复制文件描述符, 与dup相同

若cmd为F_GETFL, 获取文件描述符的flag属性值

若cmd为 F_SETFL, 设置文件描述符的flag属性

函数返回值:返回值取决于cmd

成功:

若cmd为F_DUPFD, 返回一个新的文件描述符

若cmd为F_GETFL, 返回文件描述符的flags值

若cmd为 F_SETFL, 返回0

失败返回-1, 并设置errno值.

fcntl函数常用的操作:

1.复制一个新的文件描述符:

int newfd = fcntl(fd,F_DUPFD, 0);

2 .获取文件的属性标志

int flag = fcntl(fd,F_GETFL, 0)

3 .设置文件状态标志

flag = flag | O_APPEND;

fcntl(fd, F_SETFL, flag)

4 .常用的属性标志

O_APPEND-----设置文件打开为末尾添加

O_NONBLOCK-----设置打开的文件描述符为非阻塞

使用fcntl函数设置在打开的文件末尾添加内容

//修改文件描述符的flag属性
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>int main(int argc, char *argv[])
{//打开文件int fd = open(argv[1], O_RDWR);if(fd<0){perror("open error");return -1;}//获得和设置fd的flags属性int flags = fcntl(fd, F_GETFL, 0);flags = flags | O_APPEND;fcntl(fd, F_SETFL, flags);//写文件write(fd, "hello world", strlen("hello world"));//关闭文件close(fd);return 0;
}


http://chatgpt.dhexx.cn/article/tvWVJm5p.shtml

相关文章

【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;重复做。…

java面试题题库大全800题

1、 meta标签的作用是什么 2、 ReenTrantLock可重入锁&#xff08;和synchronized的区别&#xff09;总结 3、 Spring中的自动装配有哪些限制&#xff1f; 4、 什么是可变参数&#xff1f; 5、 什么是领域模型(domain model)&#xff1f;贫血模型(anaemic domain model)和充血模…

Java基础习题库

Java基础习题库 目录 Java基础习题库 一、Java基础之概述 1.JDK,JRE,JVM三者之间的关系&#xff0c;以及JDK、JRE包含的主要结构有哪些 2.为什么要配置path环境变量&#xff1f;如何配置&#xff1f; 3.创建如下的类&#xff0c;使得运行的话可以输出&#xff1a; 4.编译…

Javase MINA框架

MINA是一个基于TCP/IP通信的JAVA框架&#xff0c;MINA可以帮助我们快速开发高性能、高扩展的网络通信应用&#xff0c;提供了事件驱动、异步操作的编程模型&#xff0c;默认使用NIO作为底层支持 客户端实现步骤&#xff1a;