Recherche…


Syntaxe

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

Paramètres

Fonction, paramètre (s), valeur de retour La description
fork() nom de la fonction
aucun n / a
Retourne PID, 0 ou -1 Le processus appelant reçoit le PID du processus nouvellement créé ou -1 en cas d'échec. L'enfant (le processus nouvellement créé) reçoit 0. En cas d'échec, définissez errno sur EAGAIN ou ENOMEM
- -
execv() nom de la fonction
const char *path Chaîne contenant le nom de l'exécutable (peut inclure un chemin)
char *const argv[] Tableau de pointeur de chaîne comme arguments
Retourne -1 en cas d'échec En cas de succès, cette fonction ne revient pas.
- -

Créer un processus enfant et attendre qu'il se ferme

Ce programme montre comment exécuter un autre processus à l'aide de fork() et attendre sa fin en utilisant waitpid() :

  • fork() crée une copie identique du processus en cours. Le processus d'origine est le processus parent, tandis que le processus nouvellement créé est le processus enfant. Les deux processus continuent exactement après le fork() .

  • waitpid() bloque jusqu'à ce que le processus fils se termine ou se termine et renvoie son code de sortie et sa raison de résiliation.

#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);
}

Exemple de sortie:

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

Copié à partir d' ici , créé à l'origine par M.Geiger.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow