Tengo un código simple para probar la función fork() .
#include<stdio.h> #include<unistd.h> #define MAX_COUNT 10 void main(void) { pid_t pid; int i; fork(); pid = getpid(); for(i = 1; i <= MAX_COUNT; i++) { printf("PID = %d, i = %d\n", pid, i); } }No funcionó como esperaba.
Mi expectativa es: el resultado del padre y el resultado del niño aparecen alternativamente. ¿Alguien puede explicarme esto y enseñarme cómo solucionarlo? ¡Gracias!
PID = 3663, i = 1 PID = 3663, i = 2 PID = 3663, i = 3 PID = 3663, i = 4 PID = 3663, i = 5 PID = 3663, i = 6 PID = 3663, i = 7 PID = 3663, i = 8 PID = 3663, i = 9 PID = 3663, i = 10 PID = 3664, i = 1 PID = 3664, i = 2 PID = 3664, i = 3 PID = 3664, i = 4 PID = 3664, i = 5 PID = 3664, i = 6 PID = 3664, i = 7 PID = 3664, i = 8 PID = 3664, i = 9 PID = 3664, i = 10La explicación es sencilla. La programación de los procesos depende del núcleo. Si se trata de un procesador de un solo núcleo, en esta ejecución decidió suspender la ejecución secundaria y permitir que el proceso principal se ejecute primero. El padre corrió por algunos bucles antes de ser suspendido a favor del niño, y así sucesivamente.
En un sistema multiprocesador, ambos procesos pueden ejecutarse en tándem, pero el dispositivo de la consola alternará la salida según el tiempo de las interrupciones.
No hay garantía de que una ejecución diferente resulte en el mismo resultado. Tampoco hay garantía de que una versión diferente del kernel no haga otra cosa.
Si desea que los procesos alternen entre bucles, ahora es el momento de aprender la comunicación entre procesos .
El proceso principal no está cediendo el control inmediatamente, y el ciclo for se ejecuta tan rápido que termina antes de que se programe el segundo proceso. Cuando ejecuto su código, obtengo impresiones no secuenciales, pero el comportamiento depende del sistema.
A veces ayuda lanzar comandos sleep() cuando juegas con fork() . Prueba este código...
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #define MAX_COUNT 10 int main(void) { pid_t pid; int i; fork(); pid = getpid(); srand(pid); // Make sure each process has a different seed for(i = 1; i <= MAX_COUNT; i++) { printf("PID = %d, i = %d\n", pid, i); // Sleep 1-3 seconds. unsigned int sleep_seconds = rand() % 3 + 1; sleep(sleep_seconds); } }