为什么在调用dup2之后关闭文件描述符?

时间:2019-05-09 02:04:46

标签: c dup2

我一生无法全力以赴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从现在开始读的东西?

1 个答案:

答案 0 :(得分:2)

open在内核中创建一个文件描述,返回的文件描述符有点像从用户空间指向它的指针,除非它是负值,在这种情况下open会失败。 dup2使得0也指向相同的文件描述(除非您传递了负值,或者除非您没有文件描述符)。如果您的目标是让0指向文件描述,那么您现在可以摆脱旧的“指针”,这样您就不会浪费文件描述符(一个进程只能分配有限的数量)。

(另外,关闭对文件描述的最后一个引用可能会导致某些所需的操作,例如,如果文件是不相同的文件,则该文件将被删除;如果您刚刚关闭了对相应写入端的最后一个引用,则该文件的读取端将接收EOF。如果您“泄漏”了一个引用(=忘记了fd而没有关闭它),则不会发生这种情况。