从 linux c 中的文件描述符重定向标准输入

redirect stdin from file descriptor in linux c

我无法理解以下代码有什么问题。我两次执行完全相同的操作。第一次成功,第二次失败

  1. 打开FD
  2. 复制到标准输入。
  3. 关闭标准输入
  4. 关闭原来的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);

If oldfd is a valid file descriptor, and newfd has the same value as oldfd, then dup2() does nothing, and returns newfd.

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

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