0
votes

C Bâtiment de contrôle du processus d'enfant

Mon objectif est de contrôler la mise en mémoire tampon du processus d'enfant lorsqu'il est exécuté avec ExecVP.

Plus précisément, je souhaite rediriger stdout et stardr vers le même descripteur de fichier (ceci est un comportement recherché, je ne peux pas changer cela). Mais, comment le mécanisme de mise en mémoire tampon par défaut provoque des comportements inattendus. Par exemple, lorsque ce script Python est exécuté dans votre borne: p>

git clone -b dev https://github.com/crazyhouse33/authbreak.git
cd authbreak/build
cmake ..
make executor


4 commentaires

Linux ou Windows? (Cela ressemble à Linux)


Pouvez-vous s'il vous plaît terminer cette phrase: ... Alors, ce dont j'ai besoin, c'est de: en 30 mots ou moins.


C'est pour Linux. Pouvez-vous me dire ce qu'il n'est pas clair dans "mon objectif est de contrôler la mise en mémoire tampon du processus d'enfant lorsqu'il est exécuté avec ExecVP"? J'ai donné un exemple de comportement attendu / obtenu et j'ai expliqué pourquoi le comportement imprévu se produit, pensant que cela aiderait à comprendre ce qui me dérange. Je vais essayer de reformululer: je veux contrôler la manière dont ma sortie de processus enfant sur mon tuyau est tamponnée par le système. Si vous effectuez une recherche autour de là, il y a 3 modes: nonuffer, ligne tamponnée ou entièrement tamponnée. Vous pouvez modifier ces modes lorsque vous utilisez le pointeur de fichier que je l'ai vu. Je ne trouve pas d'équivalent pour FD.


En plus de mots que nécessaire, je me suggère simplement de vous faire déformer votre question à un exemple de reproductible minimal .


3 Réponses :


0
votes

Étant donné que l'enfant est un programme distinct, c'est tamponner comment il le souhaite, vous devez donc le dire de ne pas tamponner, ni changer le programme.

Puisque votre enfant semble être un script Python, vous pouvez probablement faire Il fonctionne en définissant la variable d'environnement pythonunbuffered , mais qui est spécifique à Python: xxx


1 commentaires

Bonjour, j'ai pris Python juste à titre d'essai, mon code doit surveiller tout programme. Donc, cette solution n'est pas pour moi :(



2
votes

Mon objectif est de contrôler la mise en mémoire tampon du processus enfant lorsqu'il est exécuté avec ExecVP

Si fondamentalement, vous souhaitez reproduire le travail de stdbuf .

Dépistage rapide à Coreutils STDBUF Sources Cela montre que STDBUF vient de définir Les variables d'environnement < code> _stdbuf_i = $ mode _stdbuf_o = $ mode et _stdbuf_e = $ Mode https: // github. com / wertarbyte / coreutils / blob / maître / src / stdbuf.c # l221 "rel =" nOfollow noreferrer "> LD précharges le libstdbuf.so bibliothèque . libstdbuf est Ensuite, exécuté à l'intérieur du processus d'enfant juste avant qu'il ne commence - il lit les variables d'environnement _stdbuf_i _stdbuf_o et _stdbuf_e

Comme vous semblez vouloir réinventer stdbuf , faites simplement la même chose que nécessaire. (Ou, comme votre question me semble vraiment me semble vraiment comme un problème XY, utilisez simplement stdbuf . Il est typique de la coquille à utiliser stdbuf -ol dans les pipes ...).


1 commentaires

Hé, je vais essayer une dernière technique avant de valider votre solution. Je ne voulais pas utiliser de logiciel externe dans le début car je dois faire du temps l'exécution de la commande avec la meilleure précision possible (oui c'est vraiment important). Semble que ce n'est pas si grand d'une affaire depuis comment fonctionne STDBUF. Laissez-moi vérifier si je ne trouve pas quelque chose de mieux.



0
votes

Si quelqu'un traverse le même problème. Il semble impossible de faire du code parent quoi que vous fassiez. J'ai essayé d'ouvrir le tuyau comme un flux (Fdopen) et appelez SETVBUF sur chaque conduite, dans l'enfant et les parents. Il échoue silencieusement.

Donc, je suppose que tout ce que vous faites avant l'exécution, le chargeur setup STDIN et STDOUT tamponnant à nouveau et effacez votre configuration. J'ai donc fait un module C dédié à jouer avec ENVP et ARGV afin d'utiliser des astuces de variables d'environnement telles que la solution STDBUF proposée par Kamilcuk de C. Voici comment vous pouvez utiliser un sous-ensemble de celui-ci afin de répondre à cette question: xxx

maintenant si vous compilez ce code et définissez la variable libstdbuf_path au moment de la construction de Le STDBUFLIB, cela fonctionnera comme prévu. Si vous ne le définissez pas, il émettra un avertissement à l'heure de la compilation et votre ExecVP_Buffer_Control agira en tant que ExecvP de base.

J'ai créé ce module avec une flexibilité dans l'esprit. Il contient une fonction pour fusionner des tours envns tels que le STDBUF avec d'autres qui utilisent également LD_PRÉLOAD, afin de mélanger des fonctions, même si certaines variables d'ENVP se heurtent. Je souhaite que les gens tirent des gens, demandez-moi leur propre fonction, créant ainsi un vecteur d'environnement approprié tel que Build_stdbuf_exec_envp afin que ce module soit vraiment utile pour accorder le comportement du processus enfant en mode combinable.

Tout est testé. Je ferai probablement un référentiel pour le module seul, mais pour l'instant, il est dans le premier référentiel posté, les sources sont en SRC / Stuff angle. Argv.h Utilisez UNISTD.H pour récupérer l'ENVP actuel. Mais si vous le remplacez par une fonction crossplaform pour faire le travail, il deviendrait compilable sur toutes les plateformes.

Toutefois, en ce qui concerne cette question, cela souffre évidemment des mêmes inconvénients de STDBUF, et par exemple ne fonctionnera pas avec le processus qui gère leur tampon eux-mêmes, tels que Python.


0 commentaires