in

Esperar llamada al sistema en C

gfg 200x200 min

Requisito previo : Llamada al sistema de horquilla
Una llamada a wait () bloquea el proceso de llamada hasta que uno de sus procesos secundarios sale o se recibe una señal. Una vez finalizado el proceso secundario, el padre continúa su ejecución después de la instrucción de llamada al sistema de espera.
El proceso secundario puede terminar debido a cualquiera de estos:

  • Llama a exit ();
  • Devuelve (un int) de main
  • Recibe una señal (del sistema operativo u otro proceso) cuya acción predeterminada es terminar.

Wait system call in c

Sintaxis en lenguaje c:

#include
#include

// take one argument status and returns 
// a process ID of dead children.
pid_t wait(int *stat_loc);   

Si algún proceso tiene más de un proceso hijo, luego de llamar a wait (), el proceso padre tiene que estar en estado de espera si ningún hijo termina.
Si solo se termina un proceso hijo, devolver un wait () devuelve el ID de proceso del proceso hijo terminado.
Si se terminan más de un proceso hijo, wait () cosecha cualquier niño arbitrariamente y devolver un ID de proceso de ese proceso hijo.
Cuando wait () regresa, también definen estado de salida (que le dice a nuestro, un proceso por qué terminó) a través de un puntero, si el estado no es NULO.
Si algún proceso no tiene un proceso hijo, wait () devuelve inmediatamente «-1».
NOTA: «Este código no se ejecuta en IDE simple debido a un problema ambiental, así que use el terminal para ejecutar el código»
Ejemplos:

CPP

#include<stdio.h>

#include<stdlib.h>

#include<sys/wait.h>

#include<unistd.h>

int main()

{

    pid_t cpid;

    if (fork()== 0)

        exit(0);          

    else

        cpid = wait(NULL);

    printf("Parent pid = %dn", getpid());

    printf("Child pid = %dn", cpid);

    return 0;

}

Producción:

Parent pid = 12345678 
Child pid = 89546848 

C

#include<stdio.h>

#include<sys/wait.h>

#include<unistd.h>

int main()

{

    if (fork()== 0)

        printf("HC: hello from childn");

    else

    {

        printf("HP: hello from parentn");

        wait(NULL);

        printf("CT: child has terminatedn");

    }

    printf("Byen");

    return 0;

}

Producción: dependen del medio ambiente

HC: hello from child
Bye
HP: hello from parent
CT: child has terminated
     (or)
HP: hello from parent
HC: hello from child
HC: Bye
CT: child has terminated    // this sentence does 
                            // not print before HC 
                            // because of wait.
Bye

Información sobre el estado del niño:
La información de estado sobre el niño informado por espera es más que solo el estado de salida del niño, también incluye

  • terminación normal / anormal
  • causa de terminación
  • estado de salida

Para encontrar información sobre el estado, utilizamos
WIF… .Macros
1. WIFEXITED (estado): el niño salió normalmente
WEXITSTATUS (estado): código de retorno cuando el niño sale
2. WIFSIGNALED (estado): el niño salió porque no se captó una señal
WTERMSIG (estado): da el número de la señal de terminación
3. WIFSTOPPED (estado): niño se detiene
WSTOPSIG (estado): da el número de la señal de parada

/*if we want to prints information about a signal */
void psignal(unsigned sig, const char *s);

Ejemplos:
Verifique la salida del siguiente programa.

C

#include<stdio.h>

#include<stdlib.h>

#include<sys/wait.h>

#include<unistd.h>

void waitexample()

{

    int stat;

    

    if (fork() == 0)

        exit(1);

    else

        wait(&stat);

    if (WIFEXITED(stat))

        printf("Exit status: %dn", WEXITSTATUS(stat));

    else if (WIFSIGNALED(stat))

        psignal(WTERMSIG(stat), "Exit signal");

}

int main()

{

    waitexample();

    return 0;

}

Producción:

Exit status: 1              

Sabemos que si se termina más de un proceso hijo, entonces wait () cosecha cualquier proceso hijo arbitrariamente, pero si queremos cosechar algún proceso hijo específico, usamos waitpid () función.

Sintaxis en lenguaje c:
pid_t waitpid (child_pid, & status, opciones);

Parámetro de opciones

  • Si 0 significa que no hay opción, el padre tiene que esperar a que termine el hijo.
  • Si WNOHANG significa que el padre no espera si el hijo no termina, solo verifique y devuelva waitpid (). (no bloquea el proceso padre)
  • Si child_pid es -1 entonces significa cualquiera niño arbitrariamente, aquí waitpid () funciona igual que wait () funciona.

Valor de retorno de waitpid ()

  • pid de niño, si el niño ha salido
  • 0, si usa WNOHANG y el niño no ha salido.

C

#include<stdio.h>

#include<stdlib.h>

#include<sys/wait.h>

#include<unistd.h>

void waitexample()

{

    int i, stat;

    pid_t pid[5];

    for (i=0; i<5; i++)

    {

        if ((pid[i] = fork()) == 0)

        {

            sleep(1);

            exit(100 + i);

        }

    }

    

    

    for (i=0; i<5; i++)

    {

        pid_t cpid = waitpid(pid[i], &stat, 0);

        if (WIFEXITED(stat))

            printf("Child %d terminated with status: %dn",

                   cpid, WEXITSTATUS(stat));

    }

}

int main()

{

    waitexample();

    return 0;

}

Producción:

Child 50 terminated with status: 100
Child 51 terminated with status: 101
Child 52 terminated with status: 102
Child 53 terminated with status: 103
Child 54 terminated with status: 104

Aquí, los pids para niños dependen del sistema, pero en orden imprimen toda la información del niño.
Este artículo es una contribución de Kadam Patel. Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando contrib.geeksforgeeks.org o envíe su artículo por correo electrónico a contrib@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema discutido anteriormente.

Si desea aprender de los mejores videos seleccionados y problemas de práctica, consulte el Curso básico de C de Básico a Avanzado C.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

apple touch icon@2

Programa de controlador de Java? – Desbordamiento de pila

Botox vs Dysport – Diferencia y comparación