码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • dup dup2 不仅仅是int那么简单


    dup和dup2都是复制文件描述符的函数。作用像指向某个文件流的指针。但是文件描述符的值又像int那样直观。所以有时候如果直接赋值,其实是没有多大效果的。

    在uulp中(understand unix/linux programming)中第329页给出了一个dup函数的使用案例:

    #include
    #include
    #include
    #include

    #define CLOSE_DUP
    //#define USE_DUP2

    int main(){
        int fd;
        //int newfd;
        char line[100];

        fgets(line ,100, stdin); printf("%s",line);
        fgets(line ,100, stdin); printf("%s",line);
        fgets(line ,100, stdin); printf("%s",line);

        

        fd = open("data", O_RDONLY);
    #ifdef CLOSE_DUP
        close(0);
        //printf("fd=%d\n",fd);
        newfd = dup(fd);
        
       
        printf("newfd = %d\n",newfd);
    #else
        printf("fd = %d\n",fd);
        newfd = dup2(fd,0);
        printf("newfd = %d\n",newfd);
    #endif
        
      if(newfd != 0){
            fprintf(stderr, "Could not duplicate fd to 0\n");
            exit(1);
        }

        fgets(line ,100, stdin); printf("%s",line);
        fgets(line ,100, stdin); printf("%s",line);
        fgets(line ,100, stdin); printf("%s",line);

        return 0;
    }


    上面这个程序首先从标准输入获取三行,然后关闭标准输入文件描述符0,然后把打开data文件的文件描述符复制为0,这样就把标准输入重定向到data文件。然后最后三行代码从data文件获取三行输入。

    测试结果:

    1. abd
    2. abd
    3. ekd
    4. ekd
    5. loi
    6. loi
    7. fd = 3
    8. newfd = 0
    9. 1234566444 3874732
    10. 1237 328318 443.223
    11. 19384 54030 0504045 1234566444 3874732

    这里我做了一个实验。就是把newfd直接赋值为0,而不是通过dup函数复制,结果发现是没有用的,这样做的后果是不会发生重定向,最后三行是从前面buf中最后的数据输出了三遍。

    1. abc
    2. abc
    3. ifj
    4. ifj
    5. atlast
    6. atlast
    7. fd=0
    8. atlast
    9. atlast
    10. atlast

    然后找到了一片kernel源码分析的文章,在这里做个保存

    Linux内核分析:dup、dup2的实现

  • 相关阅读:
    智能电网中需求响应研究(Matlab代码实现)
    Selenium入门(二)Java整合Selenium实现模拟登录
    ChatGPT AIGC Python实现自动切换年份进行动态图表可视化
    【2022最新核心面试资料 】最强Java面试八股文秋招offer召唤术!入职薪资53k
    1.浏览器架构
    2021年09月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
    Linux platform子系统【2】-PLATFORM注册(struct device)platform_bus
    8.11模拟赛总结
    rem 实现自应用屏幕大小
    Linux操作系统(四):内存管理组件
  • 原文地址:https://blog.csdn.net/m0_47161778/article/details/125908301
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号