Buscar..


Sintaxis

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

Parámetros

Función, parámetro (s), valor de retorno Descripción
fork() nombre de la función
ninguna n / A
Devuelve PID, 0 o -1 El proceso de llamada recibe el PID del proceso de nueva creación o -1 en caso de error. El elemento secundario (el proceso recién creado) recibe 0. En caso de error, establezca errno en EAGAIN o ENOMEM
- -
execv() nombre de la función
const char *path Cadena que contiene el nombre de a ejecutable (puede incluir la ruta)
char *const argv[] Matriz de puntero de cadena como argumentos
Devuelve -1 en caso de fallo En caso de éxito esta función no vuelve.
- -

Crear proceso hijo y esperar hasta que salga.

Este programa muestra cómo ejecutar otro proceso usando fork() y esperar su terminación usando waitpid() :

  • fork() crea una copia idéntica del proceso actual. El proceso original es el proceso primario, mientras que el creado recientemente es el proceso secundario. Ambos procesos continúan exactamente después de la fork() .

  • waitpid() bloquea hasta que el proceso hijo finalice o finalice y devuelve su código de finalización y su motivo de finalización.

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

Ejemplo de salida:

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

Copiado desde aquí , originalmente creado por M.Geiger.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow