我无法理解以下代码的错误。我执行两次完全相同的动作。它第一次起作用,第二次失败。
第二次出现错误,在第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
答案 0 :(得分:3)
根据man page
int dup2(int oldfd, int newfd);
如果
oldfd
是有效的文件描述符,并且newfd
与oldfd具有相同的值,则dup2()
不执行任何操作,并返回newfd
。
因此,在您的第二种情况下,open()
使用最少的可用FD 0
[最后一次拨打close()
时免费]。那就是oldFD
和newFD
变得相同,从而产生错误。
注意:在使用fd
返回的open()
之前,您应该始终验证open()
来电的成功。