Frage

Wenn Sie Rohr zwei Verfahren und töten die man am „Ausgang“ des Rohres, das ersten Verfahren verwendet, um das „Broken Pipe“ Signal zu empfangen, die es in der Regel als gut beendet. Z.B. Laufen

$> do_something_intensive | less

und dann Beenden weniger verwendet, um Sie sofort auf eine ansprechende Hülle zurück, auf einem SuSE8 oder früheren Versionen. Wenn ich das heute versuchen, do_something_intensive ist offensichtlich läuft noch, bis ich es manuell zu töten. Es scheint, dass sich etwas geändert hat (glib? Shell?) Das macht „Rohrbrüche“ Programm ignorieren ...

Jeder von euch hat Hinweise auf das? wie das frühere Verhalten wiederherzustellen? warum es wurde geändert (oder warum es immer gegeben mehrere Semantik)?

Bearbeiten : weitere Tests (mit strace) zeigen, dass "SIGPIPE" ist erzeugt wird, sondern, dass das Programm nicht unterbrochen wird. Ein einfaches

#include <stdio.h>
int main() 
{
   while(1) printf("dumb test\n");
   exit(0);
}

wird weitergehen mit einem endlosen

--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)

, wenn weniger getötet wird. Ich könnte sicher Programm ein Signal-Handler in meinem Programm und sicherzustellen, dass es beendet, aber ich bin mehr der Suche nach etwas Umgebungsvariable oder eine Shell-Option, die Programme zwingen würde, auf SIGPIPE zu beenden

Bearbeiten wieder : es scheint ein tcsh-spezifisches Problem (bash behandelt es richtig) und Terminal-abhängigen (Eterm 0.9.4) zu sein

War es hilfreich?

Lösung 3

Vielen Dank für Ihre Ratschläge, die Lösung immer näher ...

Nach der manpage von tcsh „Nicht-Login-Shells erben das beenden Verhalten von ihren Eltern. Andere Signale, die Werte haben, die die Schale von der übergeordneten geerbt.“

Welche meine vorschlagen Terminal ist eigentlich die Wurzel des Problems ... wenn es ignoriert SIGPIPE, die Shell selbst SIGPIPE ignorieren wird auch ...

edit: ich habe die endgültige Bestätigung, dass das Problem nur mit Eterm + Tcsh entsteht und fand ein verdächtig fehlendes Signal (SIGPIPE, SIG_DFL) in Eterm Quellcode. Ich denke, dass in der Nähe der Fall ist.

Andere Tipps

Nun, wenn es ein Versuch, ein Rohr zu schreiben ist, nachdem der Leser weg ist, wird ein SIGPIPE Signal erzeugt. Die Anwendung verfügt über die Fähigkeit, dieses Signal zu fangen, aber wenn dies nicht der Fall, wird der Prozess getötet.

Die SIGPIPE nicht erzeugt werden, bis der Angerufene Prozess zu schreiben versucht, so, wenn es nicht mehr ausgegeben, es wird nicht erzeugt werden.

Hat "tun etwas intensiver" überhaupt geändert?

Wie Daniel erwähnt SIGPIPE ist keine magische „Pfeife ging weg“ Signal, sondern ein „netter Versuch, können Sie nicht mehr lesen / schreiben, das Rohr“ -Signal aus.

Wenn Sie die Kontrolle über „tun etwas intensiver“ Sie könnten es ändern, um eine „Fortschrittsanzeige“ -Ausgabe zu schreiben, wie sie sich dreht. Dies würde die SIGPIPE in einer angemessenen Art und Weise erhöhen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top