2011-10-04 12 views
10

He estado buscando crear demonios Unix, y parece haber dos métodos. El uno de largo aliento, que parece llegar cuando se busca es llamar fork(), setsid(), fork() de nuevo, chdir() a un lugar seguro, establezca umask() y, por último, close()stdin, stdout y stderr.¿Cuál es la diferencia entre llamar a daemon() y llamar a fork(), setsid(), fork(), etc.?

Sin embargo, al ejecutar man daemon, aparece información sobre una función daemon(), que parece hacer las mismas cosas que antes. ¿Hay alguna diferencia entre los dos enfoques o es daemon() solo una función de conveniencia que hace lo mismo que el método largo? ¿Es uno mejor, especialmente para un programador C novato?

Respuesta

19

La función daemon no está definida en POSIX, por lo que su implementación (si existe) podría comportarse de manera diferente en diferentes plataformas.

en Linux con glibc, daemon sólo hace un tenedor, opcionalmente chdir s (pero sólo a /, no se puede especificar una ruta), no toca umask, y no cerrar los std* descriptores (que opcionalmente les vuelve a abrir a /dev/null). (source)

Por lo tanto, depende de la plataforma, y ​​al menos una implementación hace menos de lo que usted hace. Si necesita todo lo que está haciendo, quédese con eso (o quédese en una plataforma donde la función daemon hace exactamente eso).

+10

Dejar los descriptores de archivo 0, 1 y 2 abiertos a '/ dev/null' es preferible a cerrarlos, porque de lo contrario los siguientes archivos que abra su daemon (archivos de registro, sockets, ...) obtendrán los descriptores de archivos, que podría morderlo, digamos cuando alguna biblioteca a la que llama decide escribir un error en 'stderr' ... – caf

+0

Buena llamada al no cerrar descriptores 0, 1 y 2. –

1

La llamada de daemon resume el procedimiento de bifurcación prolijo, y no recuerdo ninguna implementación que haga algo más.

Dado que daemon() es un concepto de alto nivel, es definitivamente preferible para principiantes y programadores experimentados.

2

Tenga en cuenta que daemon no cumple con ningún estándar. Es mejor utilizar las funciones de conformidad estándar (como POSIX-defined fork y setsid).

Cuestiones relacionadas