2010-09-14 5 views
8

J'ai déjà lu la page man de la famille de fonctions pidfile. Mais je ne le comprends pas vraiment. Quelle est l'utilisation correcte? Y at-il un exemple plus élaboré disponible? Je pense que je comprends pidfile_open. Mais quand dois-je appeler pidfile_write et prdfile_close? De quel processus? Parent ou enfant? Quels paramètres dois-je transmettre à ces fonctions? Il me semble que je manque de quelques principes fondamentaux.Comment utiliser la librairie pidfile correctement?

Mise à jour:

Ci-dessous vous voyez l'exemple de pidfile homme. Pourquoi fourchent-ils deux fois? Pourquoi pidfile_close? Quand j'appelle pidfile_close, je peux démarrer un autre démon. N'est-ce pas indésirable?

struct pidfh *pfh; 
pid_t otherpid, childpid; 

pfh = pidfile_open("/var/run/daemon.pid", 0600, &otherpid); 
if (pfh == NULL) { 
     if (errno == EEXIST) { 
       errx(EXIT_FAILURE, "Daemon already running, pid: %jd.", 
        (intmax_t)otherpid); 
     } 
     /* If we cannot create pidfile from other reasons, only warn. */ 
     warn("Cannot open or create pidfile"); 
} 

if (daemon(0, 0) == -1) { 
     warn("Cannot daemonize"); 
     pidfile_remove(pfh); 
     exit(EXIT_FAILURE); 
} 

pidfile_write(pfh); 

for (;;) { 
     /* Do work. */ 
     childpid = fork(); 
     switch (childpid) { 
     case -1: 
       syslog(LOG_ERR, "Cannot fork(): %s.", strerror(errno)); 
       break; 
     case 0: 
       pidfile_close(pfh); 
       /* Do child work. */ 
       break; 
     default: 
       syslog(LOG_INFO, "Child %jd started.", (intmax_t)childpid); 
       break; 
     } 
} 

pidfile_remove(pfh); 
exit(EXIT_SUCCESS); 
+0

La page de manuel que vous voyez a-t-elle une section "exemple"? Le BSD fait, ce qui illustre assez bien l'utilisation commune. Voir http://fuse4bsd.creo.hu/localcgi/man-cgi.cgi?pidfile+3, consultez la section "exemple". –

+0

@Tim, la page man contient un exemple mais j'ai des problèmes pour l'appliquer à mon code démon. Mon démon est différemment structuré. Par exemple je n'utilise pas la fonction daemon (3). –

Répondre

5

Le problème est que vous voulez donner un message d'erreur avant que le démon est donné naissance, et que vous savez que le fichier PID après le démon est donné naissance.

Ainsi, vous faites généralement le pidfile_open avant la fourche, ce qui vous donne la possibilité de donner un message d'erreur. Après avoir forké, vous connaissez le pidfile et vous pouvez faire pidfile_write.

+0

Pourquoi la fourche de toute façon? daemon() forks, n'est-ce pas? Pourquoi une deuxième fourchette? –

+0

Oui, les fourches daemon(). Je voulais dire cette fourchette, il n'y a pas de seconde fourchette. Vous appelez donc pidfile_open(), daemon(), pidfile_write(), pidfile_close(). De cette façon, vous pouvez envoyer toutes les erreurs de pidfile_open() au terminal (avant qu'il ne soit détaché) et écrire le PID de l'enfant, qui est seulement connu après l'appel de daemon(). – Sjoerd

+0

Oh, je pensais que vous vouliez dire le code d'exemple de man pidfile. Parce qu'il y a une "seconde" fork après daemon(). Est-ce que tu sais pourquoi? –

1

Vous faites le pidfile_open (3) avant de passer en arrière-plan, de sorte que vous pouvez signaler immédiatement tout problème. Vous n'écrivez pas PID pour le moment, car votre PID changera après le démon (3). pidfile_open (3) ne verrouille que le fichier pid. Après le démon (3) vous pouvez appeler pidfile_write (3) car vous avez maintenant votre dernier PID (démon (3) forks en interne). Dans le processus principal, vous ne pouvez pas appeler pidfile_close (3), car c'est l'idée même - en gardant le fichier pidfile ouvert et verrouillé, vous faites savoir aux autres que vous êtes toujours en vie. La deuxième fourchette est totalement optionnelle. Il illustre le comportement commun que les démons engendrent les processus enfants/travailleurs. Si vous ne les utilisez pas, vous n'avez pas besoin de cette fourche(). Cette fork() est seulement là pour montrer que dans un tel processus de travail, vous devez fermer le fichier pid, de sorte qu'il n'est maintenu ouvert et verrouillé que par le processus principal et non par l'enfant.

Questions connexes