Suche…


Syntax

  • pid_t getpid (void);
  • pid_t getppid (void);
  • pid_t fork (void);
  • pid_t waitpid (pid_t pid, int * wstatus, int-Optionen);
  • int execv (const char * pfad, char * const argv []);

Parameter

Funktion, Parameter, Rückgabewert Beschreibung
fork() Funktionsname
keiner n / a
Gibt PID, 0 oder -1 zurück Der aufrufende Prozess erhält die PID des neu erstellten Prozesses oder -1 bei einem Fehler. Das EAGAIN ENOMEM (der neu erstellte Prozess) erhält 0. Bei einem Fehler wird errno entweder auf EAGAIN oder ENOMEM
- -
execv() Funktionsname
const char *path Zeichenfolge, die den Namen der ausführbaren Datei enthält (möglicherweise Pfad enthalten)
char *const argv[] String-Zeigerarray als Argumente
Gibt bei einem Fehler -1 zurück Bei Erfolg kehrt diese Funktion nicht zurück.
- -

Erstellen Sie einen untergeordneten Prozess und warten Sie, bis er beendet wird

Dieses Programm zeigt, wie ein anderer Prozess mit fork() und seine Beendigung mit waitpid() :

  • fork() erstellt eine identische Kopie des aktuellen Prozesses. Der ursprüngliche Prozess ist der übergeordnete Prozess, während der neu erstellte Prozess der untergeordnete Prozess ist. Beide Prozesse werden genau nach der fork() fortgesetzt.

  • waitpid() blockiert, bis der waitpid() Prozess beendet wird und seinen Beendigungscode und seinen Beendigungsgrund zurückgibt.

#include <unistd.h>     /* for fork(), getpid() */
#include <sys/types.h>  /* for waitpid() */
#include <sys/wait.h>   /* for waitpid() */
#include <stdlib.h>     /* for exit() */
#include <stdio.h>      /* for printf(), perror() */

int
main(int argc, char *argv[])
{
    /* Create child process.
     *
     * On success, fork() returns the process ID of the child (> 0) to the
     * parent and 0 to the child. On error, -1 is returned.
     */
    pid_t child_pid = fork();

    if (child_pid < 0) {
        perror("fork() failed");
        exit(EXIT_FAILURE);
    } else if (child_pid == 0) {
        /* Print message from child process.
         *
         * getpid() returns the PID (process identifier) of current process,
         * which is typically int but doesn't have to be, so we cast it.
         *
         * getppid() returns the PID of the parent process.
         */
        printf("from child: pid=%d, parent_pid=%d\n",
                 (int)getpid(), (int)getppid());

        /* We can do something here, e.g. load another program using exec().
         */
        exit(33);
    } else if (child_pid > 0) {
        /* Print message from parent process.
         */
        printf("from parent: pid=%d child_pid=%d\n",
                  (int)getpid(), (int)child_pid); 
        
        /* Wait until child process exits or terminates.
         *
         * The return value of waitpid() is PID of the child process, while
         * its argument is filled with exit code and termination reason.
         */
        int status;
        pid_t waited_pid = waitpid(child_pid, &status, 0);

        if (waited_pid < 0) {
            perror("waitpid() failed");
            exit(EXIT_FAILURE);
        } else if (waited_pid == child_pid) {
            if (WIFEXITED(status)) {
                /* WIFEXITED(status) returns true if the child has terminated 
                 * normally. In this case WEXITSTATUS(status) returns child's
                 * exit code.
                 */
                printf("from parent: child exited with code %d\n",
                          WEXITSTATUS(status));
            }
        }
    }

    exit(EXIT_SUCCESS);
}

Beispielausgabe:

from parent: pid=2486 child_pid=2487
from child: pid=2487, parent_pid=2486
from parent: child exited with code 33

Von hier kopiert, ursprünglich von M.Geiger erstellt.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow