2016-06-11 7 views
1

Ich las einen Artikel und ich las folgendes: Angenommen, wir möchten einen externen Befehl ausführen und warten, bis er beendet wird. Wir wollen nicht ewig warten, wir wollen ein Timeout setzen, nach dem wir den Child-Prozess beenden werden. Wie macht man das? Um einen Befehl auszuführen, verwenden wir fork (2) und execve (2). Um zu warten, dass ein bestimmter Prozess beendet wird, können wir die Funktion waitpid (2) verwenden, aber es gibt keinen Timeout-Parameter. Wir können auch eine Schleife erstellen, in der wir sleep (3) mit dem Timeout als Argument aufrufen und die Tatsache verwenden, dass sleep (3) vom SIGCHLD-Signal unterbrochen wird. Diese Lösung wird ... fast funktionieren. Es würde eine Race-Bedingung enthalten: Wenn der Prozess sofort beendet wird, bevor wir sleep (3) aufrufen, warten wir, bis das Timeout abläuft. Es ist ein Rennen ähnlich dem zuvor beschriebenen. Wie wird der Systemaufruf unterbrochen? Sendet das Kind das Signal an den Elternprozess oder den Systemaufruf sleep (3)? Ich bekomme nicht, wie der Systemaufruf die Ausführung beendet und an den übergeordneten Prozess übergibt, ist der Systemaufruf wie ein anderer Prozess?Wie können Signale einen Systemaufruf unterbrechen?

Antwort

1

Wie wird der Systemaufruf unterbrochen verwenden könnte? Sendet das Kind das Signal an den Elternprozess oder den Systemaufruf sleep (3)?

Wenn das Kind-Prozess den Systemaufruf exit (2) ausführt, die Kernel-Funktion do_exit(), von dort und von dort exit_notify()do_notify_parent() genannt wird, die SIGCHLD dem Mutter sendet und ruft __wake_up_parent().

Ich bekomme nicht, wie der Systemaufruf die Ausführung stoppt und an den übergeordneten Prozess weitergeleitet wird, ist der Systemaufruf wie ein anderer Prozess?

Der zugrunde liegende Systemaufruf sleep() versetzt den aufrufenden Prozess in den Zustand TASK_INTERRUPTIBLE - siehe e. G. Sleeping in the Kernel. Danach wird der Prozess einfach nicht geplant, bis durch __wake_up_parent() oben oder die Zeitüberschreitung geweckt wird.

1

Sie könnten ein Kind mit gnu popen Ref gnu libc Pipe to a Subprocess.

Dies könnte helfen, wenn Sie das Kind aus in der Lage, zurückgesetzt den Alarm aufhören wollen.

Und dann

Der Alarm und setitimer Funktionen bieten einen Mechanismus für einen Prozess selbst in Zukunft zu unterbrechen. Sie tun dies, indem sie einen Timer setzen; Wenn der Timer abläuft, empfängt der Prozess ein Signal.

NB Sie würden rufen Sie die oben vor execve

Portabilität Hinweis: Die setitimer und getitimer Funktionen abgeleitet werden von BSD Unix, während die Alarm Funktion durch angegeben der POSIX.1 Standard. Setitimer ist stärker als Alarm, aber Alarm ist häufiger.

Ref libc Setting Alarm

Sie auch Timeout Ref man timeout part of coreutils

Alles Gute