我一生无法全力以赴dup2()
。
int fd = open("data", O_RDONLY);
/* open the disk file */
int newfd = dup2(fd,0);
/* close 0, dup fd to 0 */
if( newfd != 0)
{
fprintf(stderr,"Could not duplicate fd to 0\n");
exit(1);
}
close(fd);
因此,我了解到dup2()
在这种情况下将关闭0(stdin的标准键盘输入),然后它将使stdin从文件数据中读取,但是为什么要close(fd)
呢?我以为fd是stdin从现在开始读的东西?
答案 0 :(得分:2)
open
在内核中创建一个文件描述,返回的文件描述符有点像从用户空间指向它的指针,除非它是负值,在这种情况下open
会失败。 dup2
使得0
也指向相同的文件描述(除非您传递了负值,或者除非您没有文件描述符)。如果您的目标是让0
指向文件描述,那么您现在可以摆脱旧的“指针”,这样您就不会浪费文件描述符(一个进程只能分配有限的数量)。
(另外,关闭对文件描述的最后一个引用可能会导致某些所需的操作,例如,如果文件是不相同的文件,则该文件将被删除;如果您刚刚关闭了对相应写入端的最后一个引用,则该文件的读取端将接收EOF。如果您“泄漏”了一个引用(=忘记了fd而没有关闭它),则不会发生这种情况。