Почему мы закрываем дескриптор файла после вызова dup2? - PullRequest
1 голос
/ 09 мая 2019

Я не могу на всю жизнь полностью обрести голову 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 (стандартный ввод с клавиатуры для стандартного ввода), тогда он будет выполнять считывание стандартного ввода из данных файла, но с чего бы вам тогда close(fd)? Я думал, что fd - это то, что теперь читает stdin?

1 Ответ

2 голосов
/ 09 мая 2019

open создает описание файла в ядре, а возвращаемый дескриптор файла является своего рода указателем на него из пользовательского пространства, если только это не отрицательное значение, в этом случае open не удалось. dup2 заставляет 0 также указывать на то же самое описание файла (если вы не передали отрицательное значение или если у вас нет файловых дескрипторов). Если ваша цель состояла в том, чтобы 0 указывал на описание файла, теперь вы можете избавиться от старого «указателя», чтобы не тратить файловые дескрипторы (процесс может выделить только ограниченное число).

(Кроме того, закрытие последней ссылки на описание файла может привести к определенным желательным действиям, таким как удаление файла, если он не понравился, или конец чтения канала, получающего EOF, если вы только что закрыли последнюю ссылку на соответствующий конец записи . Этого не произойдет, если вы «утекли» ссылку (= забыли, что такое fd, не закрывая ее)).

...