Перенаправление STDIN, STDOUT, STDERR в /dev/null в C

В сетевом программировании UNIX Stevens он упоминает перенаправление stdin, stdout и stderr, которые необходимы при настройке демона. Он делает это со следующим кодом C

/* redirect stdin, stdout, and stderr to /dev/null */
open("/dev/null", O_RDONLY);
open("/dev/null", O_RDWR);
open("/dev/null", O_RDWR);

Я смущен, как эти три "знают", что они перенаправляют три std *. Тем более, что последние две команды одинаковы. Может ли кто-нибудь объяснить или указать мне в правильном направлении?

Ответы

Ответ 1

Предположительно дескрипторы файлов 0, 1 и 2 уже были закрыты, когда этот код выполняется, и нет других потоков, которые могли бы выделять новые файловые дескрипторы. В этом случае, поскольку open требуется всегда назначать наименьший доступный номер дескриптора файла, эти три вызова для открытия будут давать дескрипторы файлов 0, 1 и 2, если они не сработают.

Ответ 2

Это потому, что дескрипторы файлов 0, 1 и 2 соответственно вводятся, выводятся и ошибки, а open захватывают доступный первый дескриптор файла. Обратите внимание, что это будет работать, только если файловые дескрипторы 0, 1 и 2. еще не используются.

И вы должны быть осторожны с используемыми терминами, stdin, stdout и stderr на самом деле являются файловыми дескрипторами (FILE*), а не файловыми дескрипторами, хотя есть корреляция между ними и файловыми дескрипторами.