2010-11-24 9 views
13

En la Programación de red UNIX de Stevens, menciona la redirección de stdin, stdout y stderr, que se necesita al configurar un daemon. Lo hace con el siguiente código CRedireccionando STDIN, STDOUT, STDERR a/dev/null en C

/* redirect stdin, stdout, and stderr to /dev/null */ 
open("/dev/null", O_RDONLY); 
open("/dev/null", O_RDWR); 
open("/dev/null", O_RDWR); 

estoy confundido cómo estos tres 'saben' que vamos a redirigir los tres std *. Especialmente dado que los dos últimos comandos son iguales. ¿Podría alguien explicarme o señalarme en la dirección correcta?

+2

Tch. Es peligroso hacerlo de esta manera. Siempre use 'dup2()'. –

+2

No es peligroso si su proceso es de subproceso único y ya ha cerrado el viejo stdin/out/err. –

+0

Esta respuesta podría ayudar de alguna manera a ayudar: http://stackoverflow.com/a/4973065/207753 – SlappyTheFish

Respuesta

12

Posiblemente los descriptores de archivo 0, 1 y 2 ya se han cerrado cuando se ejecuta este código, y no hay otros subprocesos que puedan estar asignando nuevos descriptores de archivo. En este caso, dado que se requiere que open siempre asigne el número de descriptor de archivo más bajo disponible, estas tres llamadas a abrir generarán los descriptores de archivo 0, 1 y 2, a menos que fallen.

+0

¿Alguna razón eligió 'O_RDWR' en lugar de' O_WRONLY'? –

+0

Porque el orden de los descriptores de archivo es stdin, stdout, stderr. La entrada estándar es, por supuesto, de solo lectura. – slezica

+0

Seguramente stdout y stderr se podrían abrir 'O_WRONLY', pero no creo que realmente importe ... –

3

Es porque los descriptores de archivo 0, 1 y 2 son entrada, salida y error, respectivamente, y abierto obtendrá el primer descriptor de archivo disponible. Tenga en cuenta que esto solo funcionará si los descriptores de archivos 0, 1 y 2 aún no se están utilizando.

Y hay que tener cuidado con los términos utilizados, stdin, stdout y stderr son en realidad presentar asas (FILE*) en lugar de descriptores de archivo, aunque hay una correlación entre estos y los descriptores de fichero.

Cuestiones relacionadas