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

В книге Стивенса «Сетевое программирование UNIX» он упоминает перенаправление 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*. Тем более, что последние две команды одинаковы. Может ли кто-нибудь объяснить или указать мне в правильном направлении?


person Paul    schedule 24.11.2010    source источник
comment
Ч. Опасно так делать. Всегда используйте dup2().   -  person Ignacio Vazquez-Abrams    schedule 24.11.2010
comment
Это не опасно, если ваш процесс однопоточный и вы уже закрыли старый stdin/out/err.   -  person R.. GitHub STOP HELPING ICE    schedule 24.11.2010
comment
Этот ответ может помочь: stackoverflow.com/a/4973065/207753   -  person SlappyTheFish    schedule 21.10.2013
comment
Пожалуйста, не делайте этого вообще. Я знаю, что это вопрос пятилетней давности, но еще в 2003 году уже указывалось, что перенаправление stdin, stdout и stderr на /dev/null вызывает сильную головную боль системного администратора. cloud9.hedgee.com./scribbles/daemon#logging   -  person Yufan Lou    schedule 03.05.2016


Ответы (2)


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

person R.. GitHub STOP HELPING ICE    schedule 24.11.2010
comment
По какой причине он выбрал O_RDWR вместо O_WRONLY? - person Matt Joiner; 24.11.2010
comment
Поскольку порядок файловых дескрипторов такой: stdin, stdout, stderr. Стандартный ввод, конечно, только для чтения. - person slezica; 24.11.2010
comment
Конечно, stdout и stderr можно открыть O_WRONLY, но я не думаю, что это действительно имеет значение... - person R.. GitHub STOP HELPING ICE; 24.11.2010
comment
Вы правы, все дескрипторы файлов были закрыты до того, как я предоставил код. Спасибо, это имеет смысл. - person Paul; 04.12.2010

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

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

person paxdiablo    schedule 24.11.2010