Lire la sortie du processus enfant dès que certains sont disponibles?

J’ai essayé diverses méthodes (popen, pipes + fork / exec, …) pour lire la sortie d’un processus enfant. Toutes fonctionnent, mais présentent le même comportement: chaque fois que j’essaie de lire la sortie en utilisant read / fread , elle ne revient que lorsque la mémoire tampon est complètement remplie ou que l’enfant quitte. Je recherche un comportement qui ressemble davantage à celui des sockets: lire n’importe quelle quantité de données dès que certaines sont disponibles.

Comment je fais ça?

Généralement vous ne le faites pas. En particulier, le processus enfant mettra le stream en mémoire tampon car il ne verra pas un stream connecté à un canal comme étant “interactif”. Étant donné que la mise en mémoire tampon a lieu dans le processus enfant, le seul moyen de l’empêcher est de réécrire le code dans l’enfant afin de l’empêcher de mettre sa sortie standard en mémoire tampon (soit lorsqu’on passe un commutateur particulier, détecter le moment où il est connecté à un tuyau et désactiver la mise en mémoire tampon uniquement dans ce cas spécifique). Cela peut toutefois affecter les performances de l’enfant s’il écrit beaucoup sur la sortie standard (surtout si vous n’êtes pas sélectif quant à la désactivation de la mise en mémoire tampon).

Je ne pense pas que ce soit possible. La mise en mémoire tampon est gérée du côté de l’enfant et, s’il ne vide pas ses tampons, vous n’avez rien à lire. Cependant, quelques outils ont des options de ligne de commande pour contrôler la mise en mémoire tampon, par exemple grep --line-buffered .