2014-01-21 19 views
9

Ich weiß, dass waitpid() verwendet wird, um auf einen Prozess zu warten, aber wie würde man es genau verwenden?Beispiel für waitpid() in Verwendung?

Hier, was ich tun möchte, ist, erstellen Sie zwei Kinder und warten auf das erste Kind zu beenden, dann töten Sie das zweite Kind vor dem Beenden.

//Create two children 
pid_t child1; 
pid_t child2; 
child1 = fork(); 

//wait for child1 to finish, then kill child2 
waitpid() ... child1 { 
kill(child2) } 
+1

Ich bemerke, dass die 'wait (2)' man-Seite auf meinem Linux-System ein aktuelles Beispiel enthält, wie man den 'waitpid()' Systemaufruf benutzt. – larsks

+0

Ich denke, Sie könnten die Antwort ziemlich leicht finden, indem Sie auf SO nach '[c] waitpid' suchen; eher weniger leicht durch die Suche nach '[c] [waitpid]'. Ich habe 48 Fragen mit der ersten Suche und 5 mit der zweiten beantwortet, und ich bin keineswegs die einzige Person, die solche Fragen beantwortet hat. –

Antwort

13

Syntax von waitpid():

pid_t waitpid(pid_t pid, int *status, int options); 

Der Wert von pid sein kann:

  • < -1: Warten, für jedes Kind-Prozess-ID, deren Prozessgruppe ist mit dem gleichen absoluter Wert von pid.
  • -1: Warten Sie auf einen untergeordneten Prozess.
  • : Warten Sie auf einen untergeordneten Prozess, dessen Prozessgruppen-ID der des aufrufenden Prozesses entspricht.
  • > 0: Warten Sie auf das Kind, dessen Prozess-ID dem Wert pid entspricht.

Der Wert der Optionen ist ein OR von null oder mehr der folgenden Konstanten:

  • WNOHANG: sofort zurück, wenn kein Kind verlassen hat.
  • WUNTRACED: Auch zurück, wenn ein Kind aufgehört hat. Status für verfolgte Kinder, die gestoppt wurden, wird bereitgestellt, auch wenn diese Option nicht angegeben ist.
  • WCONTINUED: Wird auch zurückgegeben, wenn ein gestopptes Kind durch die Lieferung von SIGCONT wieder aufgenommen wurde.

Für weitere Hilfe verwenden Sie man waitpid.

+2

https://support.sas.com/documentation/onlinedoc/asc/doc/lr2/waitpid.htm liefert viel detailliertere Informationen mit einem Beispiel. Ich persönlich konnte immer noch nicht verstehen, wie man waitpid effektiv aus den 2 Antworten auf diese Frage hier verwendet. –

9

Die Syntax ist

pid_t waitpid(pid_t pid, int *statusPtr, int options); 

1.Wo pid der Prozess des Kindes ist, sollte es warten.

2.statusPtr ist ein Zeiger auf die Position, an der Statusinformationen für den abschließenden Prozess gespeichert werden sollen.

3. spezifiziert optionale Aktionen für die Funktion waitpid. Eine der folgenden Optionsflags angegeben werden, oder sie können mit einem bitweise inklusive OR-Operator kombiniert werden:

WNOHANG WUNTRACED WCONTINUED

Wenn dies gelingt, waitpid die Prozess-ID des beendeten Prozesses zurückgibt, deren Status wurde gemeldet. Wenn nicht erfolgreich, wird eine -1 zurückgegeben.

Vorteile warten

1.Waitpid kann verwendet werden, wenn Sie mehr als ein Kind für den Prozess haben und Sie möchten für bestimmtes Kind warten, seine Ausführung zu erledigen, bevor Eltern

wieder

2.waitpid unterstützt die Steuerung Job

3.it von nicht blockierende unterstützt der Elternprozess