0

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

  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
4

1 回答 1

3

根据手册页

int dup2(int oldfd, int newfd);

如果oldfd是一个有效的文件描述符,并且newfd与 oldfd 具有相同的值,则dup2()什么也不做,并返回newfd.

因此,在您的第二种情况下,open()使用最少可用的 FD,0[在最后一次调用时释放close()]。这就是如何变得相同,从而产生错误oldFDnewFD

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

于 2015-03-31T11:40:05.090 回答