从 linux c 中的文件描述符重定向标准输入
redirect stdin from file descriptor in linux c
我无法理解以下代码有什么问题。我两次执行完全相同的操作。第一次成功,第二次失败
- 打开FD
- 复制到标准输入。
- 关闭标准输入
- 关闭原来的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()
时免费]。这就是 oldFD
和 newFD
变得相同,从而产生错误的方式。
注意:在使用 open()
返回的 fd
之前,您应该始终验证 open()
调用是否成功。
我无法理解以下代码有什么问题。我两次执行完全相同的操作。第一次成功,第二次失败
- 打开FD
- 复制到标准输入。
- 关闭标准输入
- 关闭原来的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, andnewfd
has the same value as oldfd, thendup2()
does nothing, and returnsnewfd
.
因此,在您的第二种情况下,open()
使用最少可用的 FD,0
[上次调用 close()
时免费]。这就是 oldFD
和 newFD
变得相同,从而产生错误的方式。
注意:在使用 open()
返回的 fd
之前,您应该始终验证 open()
调用是否成功。