Lorsque vous effectuez deux processus et que vous tuez celui à la "sortie" du tuyau, le premier processus recevait le signal "Broken Pipe", qui le terminait généralement aussi. Par exemple. en cours d'exécutionUn tuyau brisé ne termine plus les programmes?
$> do_something_intensive | less
puis sortie moins utilisé pour vous retourner immédiatement à une coquille souple, sur un SuSE8 ou anciens communiqués. quand j'essaie cela aujourd'hui, do_something_intensive est évidemment encore en cours d'exécution jusqu'à ce que je le tue manuellement. Il semble que quelque chose a changé (glib? Shell?) Qui fait ignorer les "tuyaux cassés" du programme ...
Quelqu'un d'entre vous a des allusions à ce sujet? comment restaurer le comportement précédent? pourquoi cela a-t-il été changé (ou pourquoi cela a toujours existé plusieurs sémantiques)?
modifier: d'autres tests (en utilisant strace) révèlent que "SIGPIPE" est généré, mais que le programme ne soit pas interrompu. Un simple
#include <stdio.h>
int main()
{
while(1) printf("dumb test\n");
exit(0);
}
ira avec une infinie
--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)
quand moins est tué. Je pouvais pour le programme que d'un gestionnaire de signal dans mon programme et assurez-vous qu'il se termine, mais je suis plus à la recherche d'une variable d'environnement ou une option shell qui forcerait les programmes de mettre fin à SIGPIPE
modifier à nouveau: il semble être un problème spécifique à tcsh (bash le gère correctement) et dépendant du terminal (Eterm 0.9.4)
Il serait utile de savoir ce shell que vous utilisez, et plus de détails sur ce que do_something_intensive fait en réalité. Aussi, que voulez-vous dire par "évidemment toujours en cours"? Est-ce qu'il apparaît dans une liste ps, ou est-ce que le shell ne répond pas? N'hésitez pas à éditer votre question avec plus de détails! – ehdr
il apparaît dans une liste PS, le sheel ne répond pas jusqu'à ce que je tue toute la chaîne avec CTRL + C et l'utilisation du processeur devient élevée dans gkrellm. le shell utilisé est tcsh, comme cela est mentionné dans la question plus détaillée. Merci pour votre commentaire. – PypeBros