El estándar C dice que las secuencias de archivos stdin, stdout y stderr se conectarán en algún lugar, pero no especifican dónde, por supuesto. Es perfectamente factible ejecutar un programa con ellos redirigida:
some_program_of_yours >/dev/null 2>&1 </dev/null
Sus escrituras tendrán éxito - pero la información no va a ninguna parte. Una forma más brutal de funcionamiento de su programa es:
some_program_of_yours >&- 2>&- </dev/null
En esta ocasión, ha sido ejecutado sin flujos de archivos abiertos para stdout y stderr - en contravención de la la norma. Sigue leyendo desde/dev/null en el ejemplo, lo que significa que no recibe ninguna entrada de datos útil de stdin.
Muchos programas no se molestan en verificar que los canales de E/S estándar estén abiertos. Muchos programas no se molestan en verificar que el mensaje de error haya sido escrito correctamente. Diseñar un repliegue adecuado como esquema por Tim Post y whitey04 no siempre vale la pena el esfuerzo. Si ejecuta el comando ls
con sus salidas suprimidos, simplemente hacer lo que se pueda y salidas con un estado distinto de cero:
$ ls; echo $?
gls
0
$ ls >&- 2>&-; echo $?
2
$
(Probado RHEL Linux.) Realmente no hay una necesidad de que ésta hacer más. Por otro lado, si se supone que su programa se ejecuta en segundo plano y escribe en un archivo de registro, probablemente no escriba mucho a stderr, a menos que no abra el archivo de registro (o vea un error en el archivo de registro) .
Tenga en cuenta que si recurre a syslog(3)
(o POSIX), no tiene manera de saber si sus llamadas fueron "exitosas" o no; las funciones syslog no devuelven ninguna información de estado. Solo debes asumir que tuvieron éxito. Es su último recurso, por lo tanto.
Me pregunto por qué esto no ha recibido más votos que mi respuesta. +1. –
@Tim: gracias, pero su respuesta también proporciona buena información, y llegó primero. Y su punto clave, usar una función que reporte los errores, no un párrafo de código cada vez que necesite informar un error, es muy importante. –