Varios pensamientos y conclusiones sobre los procesos de padre e hijo bajo Linux

  
 

1. El proceso padre puede usar wait () /waitpid () para esperar el final del proceso hijo para evitar que ocurra un proceso hijo zombie. Por supuesto, también puede esperar a que todos los procesos hijos terminen con un ciclo de espera () /watipid (); El mejor uso es que al final del proceso secundario, la señal SIGCHLD se enviará al proceso principal, y el proceso primario responde al final del proceso secundario mediante la señal () /sigaction (). Para obtener ejemplos específicos, consulte TestFork4.c y el código clave es el siguiente: : señal (SIGCHLD, sigchld_handler); void sigchld_handler (int sig) {pid_t pid; int status; para (; (pid = waitpid (-1, &status, WNOHANG)) > 0;) {printf (" child % d murió:% d \\ n ", pid, WEXITSTATUS (status)); //pid, status);} //while ((pid = waitpid (-1, &status, WNOHANG)) > 0) { } return;}

2. Cuando finalice el proceso principal, el proceso secundario que no haya finalizado se convertirá en un proceso huérfano y el sistema tratará el proceso inicial como su proceso principal, por lo tanto, el proceso secundario se realizará después de que finalice el proceso principal. Continuar ejecutando.

3. Cuando los procesos padre e hijo coexisten, cuando se genera la señal relevante, como SIGINT, los procesos padre e hijo pueden recibir esta señal, pero solo el proceso padre responde primero. Luego, el proceso principal pasa esta señal al proceso secundario, pero el punto a tener en cuenta es: (1) Si el proceso principal no personaliza el procesamiento del proceso de la señal, los procesos primario y secundario aceptan el procesamiento predeterminado de la señal, por ejemplo: no hay SIGINT Cuando el proceso es un procesamiento personalizado, esta señal se genera y los procesos padre e hijo se cancelan inmediatamente; (2) si el proceso padre personaliza el método de procesamiento de señal, el proceso hijo acepta la señal y su método de procesamiento de señal; en este momento, si el proceso hijo queda huérfano Proceso, entonces el proceso hijo ya no aceptará esta señal y su método de procesamiento de señal. Para ejemplos específicos, consulte TestFork6.c, el código clave es el siguiente: señal (SIGINT, sig_handler); para (i = 0; i < 5; i ++ ) {if (fork () == 0) {printf (" child% d \\ n ", getpid ()) sleep (5); //En este momento, responda a la señal SIGINT, y active el proceso printf después de que la señal sea procesada ( " after sleep1: child% d \\ n ", getpid ()); sleep (5); //En este punto, el proceso secundario se convierte en un proceso huérfano, por lo que ya no responde a la señal SIGINT printf (" after sleep2: child% d \\ n ", getpid ()); exit (0);}}

4. Al crear un proceso secundario, el núcleo será el proceso principal Se copian múltiples contenidos al proceso hijo, y después de llamar a la bifurcación (), los procesos padre e hijo comparten la parte del cuerpo (en realidad es equivalente a copiar); preste atención a la copia de las dos palabras, por lo que el Dongdong modificado no tiene efecto en el proceso padre, a menos que se use padre e hijo. Método de comunicación del proceso; por lo tanto, preste especial atención a la escritura del código del proceso hijo, como la liberación del espacio dinámico, la modificación de la señal de memoria, los ejemplos específicos pueden referirse a: TestFork1.c, el código clave es el siguiente: gets (buf); pid = fork (); if (pid == 0) {printf (" child: "); strcpy (buf, " xiaofeng "); //buf aquí (una copia de buf en el proceso principal) y demás (proceso principal) La buf en la) no tiene nada que ver, porque su modificación no afecta el contenido de la buf en el proceso principal} else {printf (" parent: "); sleep (5);} printf ("% s \\ n ", buf); //La salida aquí depende de qué proceso (proceso padre /hijo) se encuentra la instrucción: (hola es la instrucción gets (buf)) hellochild: xiaofengparent: hello


5. Se agregan varias conclusiones sobre la señal: (1) Hay tres modos de procesamiento de la señal, uno es el método de procesamiento predeterminado y el otro es la señal. Una forma leve: tres son métodos personalizados de procesamiento de señales; (2) cuando un proceso se suspende en el nivel de prioridad interrumpible, la señal capturada por el proceso interrumpirá la suspensión del proceso

//, agrega Linux de multiproceso Las características del modelo de subprocesos múltiples:

El subproceso en Linux es esencialmente un proceso ligero. Cuando se genera el subproceso, se genera la estructura de control de proceso correspondiente, pero la estructura de control de proceso de la estructura y el subproceso principal. Compartió el mismo espacio de memoria de proceso. Al mismo tiempo, la estructura de control de proceso del nuevo hilo copiará la misma información de proceso del hilo principal (proceso), como abrir la lista de archivos y la máscara de bloqueo de señal. Ya que modificamos la máscara de bloqueo de señal después de que se generó el subproceso secundario, el subproceso secundario utiliza la información del proceso original del subproceso principal en este momento, por lo que el subproceso secundario aún reacciona a las señales SIGINT y SIGTERM, por lo que cuando usamos Ctrl + C Cuando se usa la señal SIGINT, el proceso principal no procesa la señal, y el proceso hijo (subproceso) realizará el procesamiento predeterminado, es decir, salir. Cuando el proceso secundario sale, envía una señal SIGCHLD al proceso principal (subproceso), lo que indica que el proceso secundario sale. Dado que la señal no está bloqueada, el proceso principal (subproceso) también sale inmediatamente, y se produce la operación anterior. Por lo tanto, una solución a este problema es establecer la señal antes de que se genere el hilo secundario, o establecer la señal dentro del hilo secundario. Como el subproceso secundario es a menudo una función de transacción, recomiendo usar el primero en un caso simple. Si la señal a procesar es más complicada, entonces se debe usar el último método.


-------------------------------------- ---- Suplemento: Proceso de Zombie

Unix: Proceso de Zombie

El proceso tiene varios estados en su ciclo de vida: suspensión, ejecución, detención, ejecución y estado muerto. . El llamado proceso zombie significa que un proceso ha salido, su memoria y los recursos relacionados han sido liberados por el kernel, pero la entrada del proceso todavía está en la tabla de procesos, por lo que su proceso primario obtiene su estado de salida. . Cuando un proceso sale, su proceso primario recibe una señal SIGCHLD. En general, el identificador de esta señal generalmente ejecuta la llamada del sistema de espera, por lo que el proceso en el estado muerto se eliminará. Si el proceso padre no hace esto, ¿cuál es el resultado? No hay duda de que el proceso estará en un estado de zombie. De hecho, el proceso zombie no daña mucho al sistema, a lo sumo su número de proceso (PID) y el sistema de elementos de proceso en la tabla de procesos no se puede usar.

Un proceso principal procesa un proceso secundario y, a continuación, ambos ejecutan su propio código. En algún momento, el proceso secundario se cierra. Pero en este momento, el proceso hijo todavía tiene una cierta cantidad de espacio y no es reciclado por el sistema operativo . El proceso principal es necesario para reciclar el proceso secundario mediante la llamada al sistema de la serie de espera, de modo que el proceso secundario pueda desaparecer completamente del sistema. Entonces, el proceso zombie es el tiempo antes de que el proceso hijo finalice antes de ser reciclado por el proceso principal.

Después de que el proceso secundario muere, envía una señal SIGCHLD al proceso principal.

Copyright © Conocimiento de Windows All Rights Reserved