我不明白下面的代码有什么问题。我做了两次完全相同的动作。它第一次工作,第二次失败。
打开FD
复制到stdin。
关闭stdin
关闭原始FD
第二次我得到一个错误,在第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

最佳答案

根据man page
int dup2(int oldfd, int newfd);
如果oldfd是有效的文件描述符,并且newfd的值与oldfd相同,则dup2()不执行任何操作,并返回newfd
因此,在第二种情况下,open()使用的fd最少,0[最后一次调用close()]时释放的fd。这就是为什么oldFDnewFD变得相同,从而产生错误。
注意:在使用fd返回的open()之前,您应该始终验证open()调用是否成功。

关于c - 从Linux C中的文件描述符重定向标准输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29367674/

10-12 00:36