Перенаправление 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*
), а не файловыми дескрипторами, хотя есть корреляция между ними и файловыми дескрипторами.