Cálculo factorial usando fork() en C para Linux

Escriba un programa Unix C usando la llamada al sistema fork() que genera el factorial y da una secuencia de series como 1, 2, 6, 24, 120… en el proceso hijo.
El número de la secuencia se proporciona en la línea de comando.
Ejemplos:

Input :gfg@ubuntu:~/$ gcc -o fork fork.c
       gfg@ubuntu:~/$ ./fork 6

Output :1 
        1  2 
        1  2  6 
        1  2  6  24 
        1  2  6  24  120 
        1  2  6  24  120  720 
        After deletion sum
        1  3  9  33  153  873 Done

Input :gfg@ubuntu:~/$ gcc -o fork fork.c
       gfg@ubuntu:~/$ ./fork -2

Output :negative number entered -2

Para crear un proceso hijo se usa fork(). tenedor() devuelve:

  • < 0 no se pudo crear el proceso secundario (nuevo)
  • = 0 para proceso hijo
  • > 0 , es decir, ID de proceso del proceso secundario al proceso principal. Cuando >0 se ejecutará el proceso principal.

Proceso hijo interno: si la entrada es 6, los primeros seis números de la secuencia factorial serán dados como salida por el proceso hijo. Debido a que los procesos padre e hijo tienen sus propias copias de los datos, será necesario que el hijo genere la secuencia.
Proceso principal interno: el padre invoca la llamada de espera() para esperar a que se complete el proceso secundario antes de salir del programa. Realice la verificación de errores necesaria para asegurarse de que no se pase un número no negativo en la línea de comandos.

// C program to illustrate factorial calculation
// using fork() in C for Linux
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <string.h>
#include <stdlib.h>
  
int main(int argc , char *argv[] )
{
    pid_t pid;
  
    if (argc != 2)
    {
        printf("arg missing or exceeding\n");
        exit(0);
    }
  
    // atoi converts string to integer
    if ( atoi ( argv[1] ) <0 )
    {
        printf("negative number entered %d", atoi(argv[1]));
        exit(0);
    }
  
    pid=fork();
  
    if ( pid<0 )
    {
        printf("failed to create child\n");
        exit(0);
    }
  
    else if ( pid==0 )
    {
        //Child Process
        int ans = 0, i, j, k = 2, n;
  
        // atoi converts string to integer
        n = atoi(argv[1]);
        int arr[n],sum[n];
  
        arr[0] = 1;
  
        // generating factorial series
        for (i=1 ; i<n; i++)
        {
            arr[i] = arr[i-1]*k;
            k++;
        }
  
        // printing and sum of each sub-series
        for (j=0; j<n; j++)
        {
            sum[j] = 0;
            for (i=0; i<=j; i++)
            {
                printf(" %d ",arr[i]);
                sum[j]+=arr[i];
            }
            printf("\n");
        }
  
        for (i=0; i<n; i++)
        {
            if ((sum[i]%2) == 0)
                sum[i] = -1;
        }
  
        printf("After deletion sum\n");
        for (i=0; i<n; i++)
        {
            if (sum[i] > 0)
                printf(" %d ", sum[i]);
        }
        exit(0);
    }
  
    // parent process
    else
    {
        wait(NULL);
  
        // waiting for child process to end
        printf("Done\n");
    }
}

Código de compilación guardado con el nombre fork.c

gfg@ubuntu:~/$ gcc -o fork fork.c

Aporte:

gfg@ubuntu:~/$ ./fork 5

Producción:

 1 
 1  2 
 1  2  6 
 1  2  6  24 
 1  2  6  24  120 
After deletion sum
 1  3  9  33  153 Done

En primer lugar, se acepta el argumento de la línea de comandos . Luego, se pasa el número de argumentos y se verifica si el argumento es positivo.
Después de eso, genere la serie factorial.
Artículo relacionado : programa en C para demostrar fork() y pipe()

Referencias:

Este artículo es una contribución de Kartik Ahuja . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@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 tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

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