Beispiel für waitpid() in Verwendung?

Lesezeit: 3 Minuten

Benutzer-Avatar
Benutzer3063864

ich weiß das waitpid() wird verwendet, um auf das Ende eines Prozesses zu warten, aber wie würde man es genau verwenden?

Hier möchte ich zwei Kinder erstellen und warten, bis das erste Kind fertig ist, und dann das zweite Kind töten, bevor ich es verlasse.

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

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

  • Ich stelle fest, dass die wait(2) man-Seite auf meinem Linux-System enthält ein aktuelles Beispiel für die Verwendung der waitpid() Systemaufruf.

    – Lerchen

    21. Januar 2014 um 3:56 Uhr

  • Ich denke, Sie könnten die Antwort ziemlich einfach finden, indem Sie auf SO nach suchen [c] waitpid; 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 bei weitem nicht die einzige Person, die solche Fragen beantwortet hat.

    – Jonathan Leffler

    21. Januar 2014 um 4:33 Uhr


Benutzer-Avatar
mf_starboi_8041

Syntax von waitpid():

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

Der Wert von pid kann sein:

  • < -1: Auf jeden untergeordneten Prozess warten, dessen Prozessgruppen-ID gleich dem absoluten Wert von ist pid.
  • -1: Auf einen untergeordneten Prozess warten.
  • 0: Auf einen untergeordneten Prozess warten, dessen Prozessgruppen-ID gleich der des aufrufenden Prozesses ist.
  • > 0: Auf das Kind warten, dessen Prozess-ID gleich dem Wert von ist pid.

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

  • WNOHANG: Sofort zurückkehren, wenn kein Kind ausgetreten ist.
  • WUNTRACED: Auch zurückkehren, wenn ein Kind aufgehört hat. Der Status für verfolgte untergeordnete Elemente, die gestoppt wurden, wird bereitgestellt, auch wenn diese Option nicht angegeben ist.
  • WCONTINUED: Auch zurückgeben, wenn ein angehaltenes Kind durch die Geburt von wieder aufgenommen wurde SIGCONT.

Verwenden Sie für weitere Hilfe man waitpid.

  • support.sas.com/documentation/onlinedoc/sasc/doc/lr2/… liefert viel detailliertere Informationen mit einem Beispiel. Ich persönlich konnte anhand der 2 Antworten auf diese Frage hier immer noch nicht nachvollziehen, wie man waitpid effektiv nutzt.

    – Colin Keenan

    10. April 2017 um 17:04 Uhr

Die Syntax ist

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

1. wobei pid der Prozess des Kindes ist, auf das gewartet werden soll.

2.statusPtr ist ein Zeiger auf den Ort, an dem Statusinformationen für den beendenden Prozess gespeichert werden sollen.

3. gibt optionale Aktionen für die Waitpid-Funktion an. Eines der folgenden Optionsflags kann angegeben oder mit einem bitweisen inklusiven OR-Operator kombiniert werden:

WNOHANG WUNTRACED WFORTSETZUNG

Bei Erfolg gibt waitpid die Prozess-ID des beendeten Prozesses zurück, dessen Status gemeldet wurde. Wenn nicht erfolgreich, wird eine -1 zurückgegeben.

Vorteile gegenüber dem Warten

1. Waitpid kann verwendet werden, wenn Sie mehr als ein untergeordnetes Element für den Prozess haben und warten möchten, bis ein bestimmtes untergeordnetes Element seine Ausführung abgeschlossen hat, bevor das übergeordnete Element fortgesetzt wird

2.waitpid unterstützt Jobsteuerung

3. Es unterstützt die Nichtblockierung des übergeordneten Prozesses

Benutzer-Avatar
Alexander Stolt

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>

int main (){
    int pid;
    int status;

    printf("Parent: %d\n", getpid());

    pid = fork();
    if (pid == 0){
        printf("Child %d\n", getpid());
        sleep(2);
        exit(EXIT_SUCCESS);
    }

//Comment from here to...
    //Parent waits process pid (child)
    waitpid(pid, &status, 0);
    //Option is 0 since I check it later

    if (WIFSIGNALED(status)){
        printf("Error\n");
    }
    else if (WEXITSTATUS(status)){
        printf("Exited Normally\n");
    }
//To Here and see the difference
    printf("Parent: %d\n", getpid());

    return 0;
}

  • Haben Sie die Dokumentation zu 1) Rückgabewert gelesen waitpid2) wenn es angebracht ist zu verwenden WEXITSTATE3) wofür würden die normalsten Exits zurückkehren WEXITSTATUS

    – Antti Haapala – Слава Україні

    21. Mai 2019 um 12:02 Uhr

  • Könntest du deine Antwort vielleicht etwas erläutern?

    – Nikolaus

    21. Mai 2019 um 12:29 Uhr

  • sehr sehr schlechtes Beispiel, Fehlerbehandlung und Aufwachen bei EINTR (passiert viel) usw. nicht behandelt.

    – Lothar

    12. April 2021 um 10:59 Uhr

1385740cookie-checkBeispiel für waitpid() in Verwendung?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy