¿Qué es un proceso?
En informática, un proceso es una instancia de un programa informático que se está ejecutando. Contiene el código del programa y su actividad actual. Dependiendo del sistema operativo (SO), un proceso puede estar compuesto por múltiples subprocesos de ejecución que ejecutan instrucciones al mismo tiempo.
¿Qué hace fork ()?
El fork () es un sistema que creará un nuevo proceso hijo. El proceso hijo creado es un proceso idéntico al padre, excepto que tiene una nueva ID de proceso del sistema. El proceso se copia en la memoria de su proceso padre, luego el kernel asigna una nueva estructura de proceso. El valor de retorno de la función es el que discrimina los dos hilos de ejecución. La función fork devuelve un 0 en el proceso del hijo, mientras que el PID del proceso hijo se devuelve en el proceso del padre.
En resumen, fork () crea un proceso hijo que se diferencia del proceso padre solo en su PID y PPID (el PID padre, el creador del proceso), y en el hecho de que las utilizaciones de recursos se establecen en 0. Bloqueos de archivos y pendientes las señales no se heredan. En Linux, fork () se implementa utilizando páginas de copia en escritura, por lo que la única penalización en la que incurre es el tiempo y la memoria necesarios para duplicar las tablas de páginas del padre y para crear una estructura de tareas única para el hijo.
Aquí hay un programa de ejemplo en c que usa la llamada al sistema fork (). Note el comentario.
/* Example of use of fork system call */ #include <stdio.h> #include <iostream> #include <string> // Required by for routine #include <sys/types.h> #include <unistd.h> #include <stdlib.h> main() { int pid; pid = fork(); if (pid < 0) { // error occurred fprintf(stderr, "Fork failed!n"); exit(-1); }else if (pid == 0) { // child process printf("I am the child, return from fork=%dn", pid); execlp("/bin/ps", "ps", NULL); }else { // parent process printf("I am the parent, return from fork, child pid=%dn", pid); printf("Parent exiting!n"); exit(0); } } |
Resultado:
programcreek:~/cdtworkspace/CPractice/src> ./a I am the parent, return from fork, child pid=15053 Parent exiting! I am the child, return from fork=0 programcreek:~/cdtworkspace/CPractice/src> PID TTY TIME CMD 15033 pts/0 00:00:00 tcsh 15053 pts/0 00:00:00 ps
Al principio, el proceso padre se ejecuta, imprime el pid secundario real y sale.
Luego, se ejecuta el proceso hijo, imprime pid 0.
Piense en por qué el proceso padre se ejecuta antes que el proceso hijo.