首页
学习
活动
专区
圈层
工具
发布

linux系统下dup和dup2函数解析

----今天接着昨天的话题讲,在昨天的文章里面,我们讲到了文件共享有三种实现方式,其中一种实现方式就是我们今天要讲的dup和dup2函数来实现了;那么咋们也就不废话 了,直接直奔主题吧。...函数解析: 1、相比于dup函数,dup2函数它的优势就是可以指定新的文件描述符的大小,用法比较灵活。...\n", fd1); fd2 = dup2(fd1, 16); printf("fd2 = %d....\n", fd2); close(fd1); return -1; } 2、dup2和dup函数一样对文件写操作都是接续写的,这里我就不做演示了,写法和dup函数一样。...上面的源代码链接:https://github.com/1121518wo/linux-/tree/master 三、Linux系统下管道符和重定向的学习补充: 这里可以参考刘遄老师写的linux就该这么学

1.3K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Linux系统调用API】七、errno()、strerror()、dup()、dup2()

    3. dup()和dup2()函数 包含头文件 #include 函数原型 int dup(int oldfd); int dup2(int oldfd, int newfd);...,先打入文件,后打至屏幕 /************************************************************ >File Name : dup_test.c...printf("second: %s\n", argv[1]); close(fd); return 0; } 我们编译运行一下,你会发现两次都打印在了屏幕上,其实这就是我们在《系统API与C库函数的调用关系...》中讲的系统调用问题,C库函数printf()会调用系统API函数write(),这是会用到一个文件指针,这里面有一个缓冲区buffer,要打印的内容会先放入到buffer中,如果我们在第一次调用printf...注意:这里的 "hello\ linux" 中,"\ " 使通过转义符把空格的特殊含义去掉,如果不加转义符,shell会把空格分开的内容当作两个字符串,通过转义符就可以实现在字符串中写入空格,这是shell

    53710

    Linux:基础IO(一.C语言文件接口与系统调用、默认打开的文件流、详解文件描述符与dup2系统调用)

    ()、write()、read() 5.文件描述符 5.1 0、1、2 5.2底层 6.文件描述符的分配规则 重定向—dup2()系统调用 7.Linux中一切皆文件 1.基础认识 文件是存储在磁盘或其他存储介质上的数据集合...有些文件可能处于未打开状态,即它们仅存在于磁盘中,没有被任何进程打开 2.再识c语言中文件接口 2.1fopen()与fclose() 当在 C 语言中进行文件操作时,fopen() 和 fclose...()系统调用 dup2() 是一个系统调用,用于复制文件描述符。...它的原型如下: #include int dup2(int oldfd, int newfd); dup2() 系统调用的作用是将 oldfd 文件描述符复制到 newfd 文件描述符处...,所以就大用了各种设备的函数了 在Linux中,“一切皆文件”(Everything is a file)是一个重要的概念,它体现了Linux操作系统的设计哲学。

    79910

    Linux笔记(5)| 文件IO操作(续)

    文件指针是包含在动态文件的文件管理表中的,所以可以看出linux系统的进程中不同fd对应的是不同的独立的文件管理表。...系统提供了dup和dup2两个API来让进程复制文件描述符。...4、文件描述符的复制 使用dup和dup2进行文件描述符复制 int dup(int oldfd); int dup2(int oldfd, int newfd); dup系统调用对fd进行复制,会返回一个新的文件描述符...6、标准IO库介绍 标准IO和文件IO有什么区别 (1)看起来使用时都是函数,但是:标准IO是C库函数,而文件IO是linux系统的API (2)C语言库函数是由API封装而来的。...(3)库函数比API还有一个优势就是:API在不同的操作系统之间是不能通用的,但是C库函数在不同操作系统中几乎是一样的。所以C库函数具有可移植性而API不具有可移植性。

    1.2K40

    【Linux篇】文件描述符背后的秘密:让你的代码更加高效

    分享给更多人:如果你觉得这篇文章对你有帮助,欢迎分享给更多对Linux OS感兴趣的朋友,让我们一起进步! 一....系统文件I/O 1.1 写文件 下面将展示用C语言库函数来打开文件,下面会用到C语言提供的库函数fwrite() size_t fwrite(const void *ptr, size_t size...有的下面将介绍一下系统调用dup2() 1.4.3 dup2()系统调用 dup2 是 Unix/Linux 系统中的一个系统调用,用于复制一个文件描述符,并将其关联到另一个指定的文件描述符。...Linux一切皆文件原理: 该图准确讲述的是在Linux等操作系统中,文件操作是如何通过结构体和函数指针实现的,以及不同设备如何通过不同的文件操作结构体来实现对文件的读写访问。...我们从 文件写入 开始,介绍了通过 C 语言的 fwrite() 和系统调用 write() 写入文件的基本方法。接着,详细讲解了 open() 系统调用的使用及其返回的文件描述符。

    47710

    【Linux系统编程】(二十)揭秘 Linux 文件描述符:从底层原理到实战应用,一篇吃透 fd 本质!

    本文将从文件描述符的定义出发,深入内核源码结构,拆解分配规则、重定向原理,结合大量C 语言实战代码,带你彻底搞懂文件描述符的核心逻辑,让你从 “会用” 升级到 “懂原理”,轻松应对 Linux 系统编程中的各类.../linux/fdtable.h file(文件元数据):/usr/src/kernels/3.10.0-1160.71.1.el7.x86_64/include/linux/fs.h 1.2.1 task_struct...Linux 提供了dup2系统调用,可以直接将一个文件描述符的指向复制到另一个文件描述符,从而更优雅地实现重定向。.../dup2_demo cat dup2_redirect.txt 运行结果: 使用dup2实现重定向:这行内容会写入文件 dup2重定向的第二行内容 dup2的优势在于:无需手动关闭newfd.../dup2_input 运行结果: 读取到的内容:dup2 input redirect test 四、文件描述符与 FILE 结构体:库函数与系统调用的关系 我们在 C

    15810

    六.Linux管道及重定向

    Linux管道及重定向 对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制。在shell中,我们通常使用符合‘|’来表示管道,符号‘>’和‘c,使用了管道来连接了两条命令来执行,能够快速地让我们知道当前目录下是否有 main.c 文件。 管道的本质是内存中的缓冲区,可以看作是打开到内存中的文件。...如果我们希望在子进程中执行管道的读端的程序例如ls | grep main.c中的grep main.c;在父进程中执行管道的写端的程序,例如ls | grep main.c中的ls。...那么, 在子进程中,先调用dup2(fd[0],0);此函数就是将标准输入的文件描述符 0,指向了管道的读端。...完整代码实现请参考StupidShell代码仓库 声明:本文为原创,作者为 对弈,转载时请保留本声明及附带文章链接:http://www.duiyi.xyz/linux%e7%ae%a1%e9%81%93%

    2.7K20

    【Linux】重定向操作的原理:修改文件描述符fd底层指向 (文件系统角度理解)

    上层fd不变(read,fgets,scanf),底层fd指向的内容改变 一.文件描述符基础知识 Linux进程默认情况下会有3个缺省打开的文件描述符,分别是 stdin标准输入0, stdout标准输出...1, stderro标准错误2. 0,1,2对应的 物理设备 一般是: 键盘,显示器,显示器 二.dup2函数介绍 我们先了解这个dup2函数,功能是改变 底层fd的指向 #include int dup2(int oldfd, int newfd); 参数: oldfd:这是你想要复制的文件描述符。...printf是C库当中的IO函数,一般往 stdout标准输出1 中输出,但是stdout底层访问文件的时候,找的还是fd:1, 但此时,fd:1下标所表示内容,已经变成了myfile的地址,不再是显示器文件的地址...,所以,输出的任何消息都会往文件中写入,进而完成输出重定向 底层等效于dup2(dp,1); 底层fd指向的内容改变,实现的重定向功能改变 fd为4为oldfd,最后被保留下来

    48310

    深入理解 Linux 系统文件 IO:从 open 到重定向的底层逻辑》

    前言 在 Linux 系统中,程序与文件的交互离不开 “系统文件 I/O”—— 这是操作系统为用户层程序提供的一套底层接口,也是理解 “程序如何操作文件” 的核心钥匙。...无论你是刚接触 Linux 开发的新手,还是想夯实底层基础的开发者,都能通过本文理清系统文件 I/O 的脉络,理解从接口调用到系统底层的映射关系。...以前C语言中FILE*fopen,FILE是C语言提供的一个结构体,一定封装了文件操作符。 默认打开的stdin,stdout,stderr封装了0,1,2. 语言的封装增加了平台的可移植性。...结束语 系统文件 I/O 是 Linux 开发的 “基本功”,也是连接用户层程序与内核文件系统的桥梁。...希望本文能成为你理解 Linux 系统文件 I/O 的起点,让你在底层开发的道路上走得更稳、更远。

    19510

    【Linux】基础IO_文件描述符与重定向

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【Linux】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【C/进阶】如何对文件进行读写(含二进制...Linux系统下进程会默认打开三个文件,即标准输入、标准输出、标准错误,分别对应文件描述符0 1 2。...因此,我们也可以推测:在C语言级别提供的文件结构体FILE中,一定存在文件描述符!...dup2原理: dup2函数的原理实际上就是通过拷贝的方式,修改原来文件描述符表中特定下标所指向的文件,这里需要注意一点的是,dup2函数在实现重定向时,会先将原有的文件描述符指向的对应的文件关闭,这样避免内存泄漏问题的出现...实际上是由C语言标准库提供,在我们进行fopen打开文件时,缓冲区在FILE结构体内。

    57830

    Linux重定向及缓冲区理解

    文件描述符:1 stderr   标准错误                   文件描述符:2 接下来仔细观察下面代码:  解释:先关闭默认打开的标准输出文件,再打开一个文件命名为log.txt,用c语言的接口...解释原因: 当一开始关闭标准输出后,文件描述符1就被空了出来,再打开新的文件,新文件被分配的文件描述符就是1,c语言的printf内部实际是往stdout中打印,fprintf也指定了是往stdout中打印...,但在c语言中stdout的文件描述符只认1,c语言只认为stdout的文件描述符是1,所以它只往文件描述符为1的文件中打印,所以打印到了文件中!...dup2接口:         接下来介绍一个重定向的重要接口dup2,先查一下手册: 简单来说它的功能就是: 将文件描述符表下标为oldfd的内容拷贝到文件描述符下标为newfd的内存中,我们用dup2...,linux每个文件都有自己的文件内核级缓冲区,也就是一段内存空间,但它究竟有什么用?

    37610
    领券