从linux c中的文件描述符重定向stdin

时间:2015-03-31 11:33:52

标签: c linux file dup

我无法理解以下代码的错误。我执行两次完全相同的动作。它第一次起作用,第二次失败。

  1. open FD
  2. 复制到stdin。
  3. close stdin
  4. 关闭原来的fd
  5. 第二次出现错误,在第4阶段,这意味着FD已经关闭。

      int fd =open("/path/to/some/file",0,"r");
      if (dup2(fd,STDIN_FILENO)<0)
        perror("dup_in");
      if (close(STDIN_FILENO)<0)
        perror("close_in");
      if (close(fd)<0)
        perror("close_fd");
    
      //Up to here it works fine.
    
      fd =open("/path/to/some/file",0,"r");
      if (dup2(fd,STDIN_FILENO)<0)
        perror("dup_in2");
      if (close(STDIN_FILENO)<0)
        perror("close_in2");
      if (close(fd)<0) //<-- ERROR!
        perror("close_fd2"); //<--close_fd2: Bad file descriptor
    

1 个答案:

答案 0 :(得分:3)

根据man page

  

int dup2(int oldfd, int newfd);

     

如果oldfd是有效的文件描述符,并且newfd与oldfd具有相同的值,则dup2()不执行任何操作,并返回newfd

因此,在您的第二种情况下,open()使用最少的可用FD 0 [最后一次拨打close()时免费]。那就是oldFDnewFD变得相同,从而产生错误。

注意:在使用fd返回的open()之前,您应该始终验证open()来电的成功。