J'ai une application serveur qui écrit dans un thread séparé un descripteur de fichier popen ("myCommand", "w") et si la commande passée à popen() renvoie une sortie vers stdout ou stderr, l'application my se termine. Cependant, ce n'est qu'un problème lorsque mon application serveur a été invoquée via inetd, si j'ai utilisé ssh pour lancer le serveur, il n'y a pas ce problème. De même, lorsque mon application serveur lit un descripteur de fichier popen ("myCommand2", "r") dans un thread séparé et si la commande passée à popen() donne une sortie à stderr (stdin va à mon pipe), l'application se termine. Encore une fois, cela se produit uniquement avec l'invocation inetd, pas avec l'invocation ssh.Pourquoi write() exécute-t-il un programme d'exit lorsque le tube écrit sur stdout?
Répondre
vous devez fermer tous les fds existants du processus avant d'ouvrir le tube, puis effectuez une redirection d'E/S. C'est parce que si inetd, le processus s'exécute comme un démon.
Pourriez-vous élaborer s'il vous plaît? Le serveur invoqué via inetd plante quand il lit ou écrit sur le tuyau fourni par popen quand ce tuyau écrit dans stderr qui n'a pas été redirigé dans l'appel à popen. – WilliamKF
Veuillez d'abord vous assurer que vous avez ajouté le nom de chemin d'accès complet à la commande appelée, par ex. par popen ("myCommand", "w"), vous écririez popen ("/ home/myCommand", ...), sinon popen() échouerait donc toute lecture/écriture du tube provoquerait segault etc, sauf si votre La commande appelée est dans le PATH. si ce n'est pas le cas, appelez daemon (0, 1) pour simuler inetd, avant d'appeler daemon(), vous devriez appeler setsid() et filtrer SIGINT, SIGHUP, SIGQUIT, SIGPIPE, SIGTTIN, SIGTTOU et SIGTERM. après la simulation, vous pouvez trouver la cause. – Test
utilise dup2() si faire la redirection. – Test
- 1. Comment utiliser fprintf et écrire sur un tube?
- 2. MagickCore écrit des données d'image sur stdout plutôt que sur un nom de fichier
- 3. Pourquoi rien n'est écrit dans un fichier?
- 4. Python - Impression sur stdout sur un "terminal"
- 5. IIS7 écrit sur un partage sur un réseau
- 6. Pourquoi mon programme Java perd-il de la mémoire lorsque j'appelle run() sur un objet Thread?
- 7. Pourquoi ce programme ne lit pas (ou écrit?) Correctement à partir d'un fichier .bin? (C++)
- 8. Vérifiez si stderr est un tube dans bash
- 9. Losing octets sur un socket non bloquant contrôle epoll lorsque l'autre côté écrit et ferme
- 10. FORTRAN WRITE()
- 11. Lorsque le code écrit pour un événement d'un contrôle, dois-je jeter objet ou référence explicitement
- 12. Comment effectuer une fopen non bloquante sur un tube nommé (mkfifo)?
- 13. Comment effacer les tampons de sortie lorsque le programme forge?
- 14. Comment puis-je savoir pourquoi subprocess.Popen wait() attend toujours si stdout = PIPE?
- 15. Pourquoi est-ce que je perds des données lors de l'utilisation d'un tube vxWorks?
- 16. NSOuputStream écrit plusieurs fois
- 17. problème avec IHTMLDocument2 :: write()
- 18. Démarrer le programme sur un deuxième moniteur?
- 19. écrit jquery un si
- 20. Python File Read + Write
- 21. Y a-t-il des répercussions sur le fait que de nombreux processus écrivent sur un seul lecteur sur un tube nommé dans Posix?
- 22. comment puis-je mettre un point d'arrêt sur "quelque chose est imprimé sur le terminal" dans gdb?
- 23. Service Windows écrit des fichiers sur le partage réseau
- 24. Comment lire le texte écrit sur une image?
- 25. NSMutableDictionary n'est pas écrit dans le fichier
- 26. Création d'un tube entre C# et Ffmpeg
- 27. Fonctionnalité par défaut de surcharge VB.NET lorsque l'utilisateur clique sur le bouton X (Fermer le programme)
- 28. Formulaire VCL d'écriture d'application sur stdout
- 29. Test de ce qui est écrit sur un Java OutputStream
- 30. write java wrapper
Inetd fonctionne en redirigeant les E/S standard du serveur lancé. C'est possible que tu manges ça. Il serait utile si vous pouviez spécifier comment votre serveur «sort». Est-ce que ça plante? Laissez un code de sortie? – Duck
Je ne sais pas comment cela se termine, cela fait partie du problème. Je vois que les destructeurs sont exécutés cependant. Je suis incapable de joindre via gdb, donc je ne sais pas ce qui échoue. Je reçois également aucun message d'erreur qui est visible pour moi. Je sais via printfs inséré dans le code que l'appel à write() ou read() est là où il échoue. – WilliamKF