Warum wartet man nicht, bis der Prozess beendet wird?

8

Im folgenden Skript versuche ich herauszufinden, wie waitpid funktioniert, aber es wartet nicht auf ssh process zum Beenden. done wird sofort gedruckt und nicht nachdem der Prozess ssh existiert.

Frage

Wie mache ich waitpid nur weiter, wenn die PID, die ich gebe, beendet wurde?

%Vor%

Ich habe es auch versucht

%Vor%

aber es erreicht nicht den ersten print aus irgendeinem Grund und wird nie beendet.

    
Jasmine Lognnes 28.12.2014, 13:57
quelle

1 Antwort

8

Die Funktionsfamilie wait funktioniert nur bei untergeordneten Prozessen, auch waitpid . Der Schlafprozess ist nicht dein Kind, es ist das Kind deines Kindes. Dies liegt daran, dass system im Wesentlichen fork + exec ist. Wenn Sie das Parallel :: ForkManager + -System verwenden, verzweigen Sie, forkieren Sie dann erneut und führen Sie dann den Ruhezustand aus.

Da du bereits gegabelt hast, solltest du exec verwenden. Dies hat den zusätzlichen Vorteil, dass der Aufruf von pgrep und sein Timing-Problem nicht benötigt wird (dh es ist möglich, dass der Elternteil pgrep aufruft, bevor das Kind das System ausgeführt hat).

%Vor%

Der Einfachheit halber wird jetzt Schlaf verwendet. Eine Warnung von Perl, dass "Statement wahrscheinlich nicht erreicht wird" muss unterdrückt werden, da Perl nicht erkennt, dass $pm->start gespalten ist. Dies sollte no warnings "exec" sein, aber das funktioniert nicht, also musste ich sie alle unterdrücken.

    
Schwern 28.12.2014, 15:52
quelle

Tags und Links