zoukankan      html  css  js  c++  java
  • [apue] dup2的正确打开方式

    管道与重定向常常需要使用dup与dup2复制句柄,其中dup2又较为常用,但是使用dup2有几个小坑需要注意。

    int dup2(int oldfd, int newfd);

    man手册页上是这样讲的,oldfd是想要复制的句柄,newfd是复制到的句柄号,如果newfd已经打开,dup2会先尝试关闭,

    复制完成后,oldfd与newfd都将指向同一文件实例。一般需要close(oldfd)来减少不必要的引用。所以一般人可能会这样写代码:

    1 if (dup2 (oldfd, newfd) != -1)
    2     close (oldfd); 

    但是有个例外的情况,就是oldfd==newfd,照man手册页上讲,此时dup2将什么也不做,直接返回成功。

    此时oldfd与newfd相同,而close(oldfd)将导致文件的唯一引用被关闭,后续的操作可想而知也会失败。

    所以万无一失的dup2使用方法是这样:

    1 if (oldfd != newfd) { 
    2     if (dup2 (oldfd, newfd) != -1)
    3         close (oldfd); 
    4 }

    样例代码

  • 相关阅读:
    MySQL数据模型
    Spring循环依赖
    @Autowired和@Resource区别
    Kafka概念
    阻塞队列
    线程池原理
    Spring AOP
    JVM 史上最最最完整深入解析(12000 字噢)
    Dubbo配置信息
    友情链接
  • 原文地址:https://www.cnblogs.com/goodcitizen/p/11001797.html
Copyright © 2011-2022 走看看