2011-10-04 14 views
10

Ho cercato di creare i demoni Unix e sembrano esserci due metodi. Il prolisso uno, che sembra venire su durante la ricerca è quello di chiamare fork(), setsid(), fork() ancora una volta, chdir() al sicuro da qualche parte, impostare umask() e, infine, close()stdin, stdout e stderr.Qual è la differenza tra chiamare daemon() e chiamare fork(), setsid(), fork(), ecc.?

In esecuzione man daemon, tuttavia, vengono visualizzate le informazioni su una funzione daemon(), che sembra fare tutte le stesse cose come sopra. Ci sono differenze tra i due approcci oppure è daemon() solo una funzione di convenienza che fa la stessa cosa del metodo prolisso? È uno migliore, soprattutto per un programmatore C principiante?

risposta

19

La funzione daemon non è definita in POSIX, quindi la sua implementazione (se presente) potrebbe comportarsi diversamente su piattaforme diverse.

su Linux con glibc, daemon solo fa una forchetta, opzionalmente chdir s (ma solo per /, non è possibile specificare un percorso), non tocca umask, e non chiude le std* descrittori (li riapre opzionalmente a /dev/null comunque). (source)

Quindi dipende dalla piattaforma e almeno un'implementazione fa meno di quello che si fa. Se hai bisogno di tutto ciò che stai facendo, attenersi a quello (o attenersi a una piattaforma in cui la funzione daemon fa esattamente questo).

+10

Lasciare i descrittori di file 0, 1 e 2 aperti a '/ dev/null' è preferibile chiuderli, perché altrimenti i file successivi che il demone si apre (file di registro, socket, ...) otterranno quei descrittori di file - quali potrebbe morderti, diciamo quando una libreria che stai chiamando decide di scrivere un errore su 'stderr' ... – caf

+0

Buona chiamata sui descrittori non di chiusura 0, 1 e 2. –

1

La chiamata daemon riepiloga la procedura a forcella prolissa e non ricordo alcuna implementazione che faccia qualcosa di più.

Dal daemon() è un concetto di alto livello, è sicuramente da preferire per i programmatori inesperti e con esperienza.

2

Si noti che daemon non è conforme a nessuno standard. È preferibile utilizzare le funzioni standard conformi (come definite da POSIX fork e setsid).