Стандарт C говорит, что файловые потоки stdin, stdout и stderr должны быть где-то соединены, но они, конечно, не указывают где.Вполне возможно запустить программу с перенаправленным ими:
some_program_of_yours >/dev/null 2>&1 </dev/null
Ваши записи будут успешными, но информация никуда не денется.Более жестокий способ запуска вашей программы:
some_program_of_yours >&- 2>&- </dev/null
На этот раз она была запущена без открытых файловых потоков для stdout и stderr - в нарушение стандарта.В этом примере он все еще читает из / dev / null, что означает, что он не получает никаких полезных данных от stdin.
Многие программы не удосуживаются проверить, что стандартные каналы ввода / выводаоткрыть.Многие программы не заботятся о том, чтобы сообщение об ошибке было успешно написано.Разработка подходящего запасного варианта в виде набросков Tim Post и whitey04 не всегда стоит усилий.Если вы запустите команду ls
с подавленными выходными данными, она просто сделает все возможное и завершит работу с ненулевым статусом:
$ ls; echo $?
gls
0
$ ls >&- 2>&-; echo $?
2
$
(проверено RHEL Linux.)нужно для этого делать больше.С другой стороны, если ваша программа должна работать в фоновом режиме и записывать в файл журнала, она, вероятно, не будет много писать в stderr, если она не сможет открыть файл журнала (или не обнаружит ошибку в файле журнала).
Обратите внимание, что если вы вернетесь к syslog(3)
(или POSIX ), у вас нет возможности узнать, были ли ваши вызовы «успешными» или нет;все функции системного журнала не возвращают информацию о состоянии.Вы просто должны предположить, что они были успешными.Поэтому это ваше последнее средство.