Je travaille sur un démon Linux et j'ai des problèmes avec le stdin / stdout. Normalement, à cause de la nature d'un démon, vous n'avez pas de stdin ou de stdout. Cependant, j'ai une fonction dans mon démon qui s'appelle lorsque le démon fonctionne pour la première fois pour spécifier différents paramètres requis pour que le démon soit exécuté avec succès. Lorsque cette fonction est appelée, le terminal devient si lent que je dois lancer une coque séparée et tuer le démon avec le dessus pour obtenir une réponse rapide réactive. Maintenant, je soupçonne que cela a quelque chose à voir avec le processus de forge fermer la fermeture du stdin / stdout, mais je ne suis pas tout à fait sûr de savoir comment je pourrais travailler autour de cela. Si vous pouviez perdre une lumière sur la situation qui serait la plus appréciée. Merci.
Edit: P>
int main(argc, char *argv[]) {
/* setup signal handling */
/* check command line arguments */
pid_t pid, sid;
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if(pid > 0){
exit(EXIT_SUCCESS);
}
sid = setsid();
if(sid < 0) {
exit(EXIT_FAILURE);
}
umask(027);
/* set syslogging */
/* do some logic to determine wether we are running the daemon for the first time and if we are call the one time function which uses fgets() to recieve some input */
while(1) {
/* do required work */
}
/* do some clean up procedures and exit */
return 0;
}
6 Réponses :
Votre conception est fausse. Les processus de démon ne doivent pas entrer entrée via STDIN ou livrer une sortie à Stdout / StDeRR. Vous fermerez ces descripteurs dans le cadre de la phase de démonisation. Les démons doivent prendre des paramètres de configuration à partir de la ligne de commande, un fichier de configuration ou les deux. Si une entrée d'exécution est requise, vous devrez lire un fichier, ouvrir une prise, etc., mais le point d'un démon est qu'il devrait être capable de fonctionner et de faire sa chose sans que l'utilisateur soit présent à la console. < / p>
Sauf si c'est un démon géré par inetd ... :-)
Normalement, l'entrée standard d'un démon doit être connectée à Tous les programmes, y compris les démons, ont le droit de supposer que STDIN, STDOUT et STDERR sont ouverts de manière appropriée des flux de fichiers. P>
Il est généralement approprié pour un démon de contrôler l'endroit où son entrée provient et des sorties vont à. Il y a rarement l'occasion d'entrer à venir d'autres que VOTRE TEMPS DE RÉPONSE SLAINGISH-PASPAISE PEUT ÊTRE PARTICULIER VOTRE PROGRAMME NE PAS PAS ATTENDRE ATTENTION SUR L'EOF dans une boucle de lecture quelque part. Il peut s'agir d'inviter l'entrée de l'utilisateur sur / dev / null et de lire une réponse de / dev / null, et de ne pas récupérer une "Y 'ou" N ", il essaie de nouveau, qui mâche votre système horriblement. Bien entendu, le code est imparfait à ne pas manipuler l'EOF et à compter le nombre de fois qu'il reçoit une réponse invalide et qui s'arrête étant idiote après un nombre raisonnable de tentatives (16, 32, 64). Le programme devrait éteindre la boutique soin et en toute sécurité s'il s'attend à une contribution significative et continue de ne pas l'obtenir. P> / dev / null null>, de sorte que si quelque chose est lu à partir de l'entrée standard, vous obtenez un EOF immédiatement. Normalement, la sortie standard doit être connectée à un fichier - un fichier journal ou / dev / null code>. Ce dernier signifie que tous les écrit réussiront, mais aucune information ne sera stockée. De même, une erreur standard doit être connectée à / dev / null code> ou à un fichier journal. P>
/ dev / null code>. Si le code a été écrit pour survivre sans sortie standard ni erreur standard (par exemple, il ouvre un canal de journal standard, ou peut-être utilisé syslog (3) code>), il peut être approprié de fermer stdout et stardr. Sinon, il est probablement approprié de les rediriger vers / dev / null code>, tout en enregistrant toujours les messages dans un fichier journal. Vous pouvez également rediriger STDOUT et STDERR vers un fichier journal - méfiez-vous de fichiers journaux en croissance continue. P>
Utilisez un fichier de configuration. N'utilisez pas Stdin ou Stdout avec un démon. Les démons sont destinés à courir dans le fond
Si vous insistez sur l'utilisation d'une entrée STDIN / clavier pour enflammer le démon (par exemple, pour obtenir une passephrase magique que vous ne voudriez pas stocker dans un fichier) puis gérer tous les E / S avant em> le Fourchette () Code>. P>
J'y ai pensé et j'ai juste essayé de confirmer et je reçois toujours le même problème avec le terminal lent. Il me dérange bien.
Votre code de code semble suggérer le contraire. Veuillez partager le code réel si vous souhaitez résoudre le problème.
Vous mentionnez à l'aide d'un fichier de configuration. C'est exactement ce que je fais pour stocker les paramètres reçus via une entrée. Cependant, j'ai toujours besoin de les obtenir de l'utilisateur via STDIN. La logique pour déterminer si nous exécutons pour la première fois est basée sur l'existence du fichier de configuration. P> blockQuote>
au lieu de em> strong> lisant stdin, demandez à l'utilisateur d'écrire le fichier de configuration eux-mêmes; Vérifiez son existence avant em> Forking, puis sortie avec une erreur si ce n'est pas le cas. Inclure un exemple de fichier de configuration avec le démon et documenter son format dans le manuel de votre démon. Vous do em> avez un manpage, oui? Votre fichier de configuration est em> textuel, oui? P>
En outre, votre logique de démonisation manque une étape clé. Après le fourche, mais avant d'appeler
setsid code>, vous devez fermer FDS 0, 1 et 2 et les rouvrir à/ dev / null code> (faire pas em > Essayez de le faire avecFCLOSE code> etfopen code>). Cela devrait corriger votre problème terminal lent. P>
Ouch s'appuyer sur l'utilisateur pour écrire le fichier de configuration? De plus, j'ai essayé de faire des E / S avant le processus de forger et je reçois toujours le même problème avec le terminal lent.
Oui, comptez absolument sur l'utilisateur pour écrire le fichier de configuration. C'est comme ça que cela se fait avec Unix. Re le terminal lent, voir Modifier.
"Do pas i> tente de le faire avec FCLOSE code> et fopen code>". Pourquoi donc et comment devrait I> nous essayons de le faire?
Vous le faites avec les primitives du système d'exploitation, Fermer code> et < un href = "http://linux.die.net/man/2/open" rel = "nofollow noreferrer"> Ouvrir code> . Si vous le faites avec FCLOSE code> et fopen code>, les tampons d'E / S seront bousillés.
Si vous souhaitez exécuter votre programme détaché, utilisez Shell : NE PAS UTILISER Mieux encore, utilisez un Daemon Manager tel que démon Outils, Runit, OpenRC et SystemD, pour démonter votre programme pour vous. p> (SetSID Fourche () code> à l'intérieur de votre programme, qui sera SYSLOG () < / Code> NOR Redirection stdout code> ou . p>
starr code>
Nous n'avons aucune idée sans voir du code. Mais ça sonne comme si tu le fais mal. Vous dites que vous voulez que le démon puisse prendre STDIN / STDOUT? Vous devrez les piler sur une prise ou quelque chose.
Oui Falmarri mais seulement lorsque cette fonction particulière est appelée que j'ai dit est une chose unique. Dans mon code, j'appelle cette fonction après ma fourchette (); un nouveau processus.
Votre terminal n'est pas vraiment lent, votre sous-processus devenue a hérité de la même FD et de voler votre entrée (vous avez maintenant plusieurs lecteurs) et le résultat est indéfini (condition de course).