Перенаправление STDIN, STDOUT, STDERR в / dev / null в C - PullRequest
13 голосов
/ 24 ноября 2010

В сетевом программировании Стивенса для 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);

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

Ответы [ 2 ]

15 голосов
/ 24 ноября 2010

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

4 голосов
/ 24 ноября 2010

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

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

...