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:
- http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html
- http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/wait.html
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