2.7 Salida del proceso, proceso huérfano, proceso zombie

Tabla de contenido

1. Salida del proceso

2. Proceso huérfano

3. Proceso zombi


1. Salida del proceso

#include <stdlib.h>
void exit(int status);

#include <unistd.h>
void _exit(int status);
    status参数:是进程退出时的一个状态信息。父进程回收子进程资源的时候可以获取到。

Procedimiento para probar la función de salida:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    printf("hello\n");   //有\n
    printf("world");     //无\n
    exit(0);
}

resultado de la operación:

Procedimiento para probar la función _exit:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
    printf("hello\n");   //有\n
    printf("world");     //无\n
    _exit(0);
}

resultado de la operación:

¿Por qué hay una diferencia entre los dos resultados de salida?

La primera instrucción printf con "\ n" actualizará el búfer. De modo que ambos programas generan un saludo

La segunda instrucción printf no tiene "\ n". De la primera figura, podemos ver que la función de salida refrescará el búfer, y la función _exit no refrescará el búfer, por lo que el primer programa también generará world, pero el el segundo programa no lo hará.


2. Proceso huérfano

programa:

#include <unistd.h>
#include <stdio.h>

int main()
{
    pid_t pid=fork();
    if(pid>0)
    {
        printf("I am a parent process! pid=%d ppid=%d\n",getpid(),getppid());
    }
    else if(pid==0)
    {
        sleep(1);
        printf("I am a child process! pid=%d ppid=%d\n",getpid(),getppid());
    }
    for(int i=0;i<3;i++)
    {
        printf("i=%d pid=%d\n",i,pid);
    }
    return 0;
}

resultado de la operación:

 

Cuando se ejecuta un programa ejecutable en la terminal, cambiará a la ejecución del programa por defecto, por lo que la salida del programa se muestra en la terminal.

Entre ellos, el id 12145 del proceso padre del proceso padre en el programa es el terminal actual, que se puede verificar:

Debido a que la terminal es el proceso principal del proceso principal en el programa, la terminal sabe cuándo termina el proceso principal en el programa y vuelve a la terminal después de que finaliza el proceso principal en el programa, por lo que mostrará el marco rojo en la figura anterior. Pero el terminal no sabe si el proceso padre tiene un proceso hijo que ha terminado de ejecutarse, por lo que el contenido del proceso hijo en el programa se mostrará más adelante. ¿Por qué la salida del proceso hijo también se muestra en la terminal actual? Porque después de la bifurcación, la tabla de descriptores de archivos del proceso hijo y el proceso padre son los mismos (compartidos durante la lectura), lo que representa la misma terminal.

El proceso huérfano será adoptado por el proceso init cuyo ID de proceso es 1, e init completará la liberación de recursos del proceso huérfano. El proceso huérfano es inofensivo.


3. Proceso zombi

programa:

#include <unistd.h>
#include <stdio.h>

int main()
{
    pid_t pid=fork();
    if(pid>0)
    {
        while(1)
        {
            printf("I am a parent process! pid=%d ppid=%d\n",getpid(),getppid());
            sleep(5);
        } 
    }
    else if(pid==0)
    {
        printf("I am a child process! pid=%d ppid=%d\n",getpid(),getppid());
    }
    for(int i=0;i<3;i++)
    {
        printf("i=%d pid=%d\n",i,getpid());
    }
    return 0;
}

resultado de la operación:

Utilice ps aux para ver la información del proceso, como se muestra a continuación:

Puede verse en la figura que el proceso hijo 12216 es un proceso zombi. Debido a que el proceso hijo ha terminado de ejecutarse, el proceso padre no ha reclamado los datos del área del núcleo del proceso hijo y el proceso padre se ha estado ejecutando. Los procesos Zombie han estado ocupando recursos del sistema, por lo que debemos encontrar una solución.

Una de las soluciones:

Deje que el proceso padre termine de ejecutarse:

Porque después de que finaliza el proceso padre, el proceso padre del proceso hijo (es decir, el proceso zombie) se convertirá en el proceso init, y el proceso init reclamará los recursos del proceso zombie.

De hecho, a veces el programa tiene que estar ejecutándose todo el tiempo y no se puede matar con ctrl + c.

Solución dos:

La función de espera o la función waitpid se llama en el proceso padre para reciclar los recursos del proceso hijo. Este método se discutirá más adelante.


Referencia: Niuke.com Proyecto de búsqueda de empleo de alto pago en C ++ "Desarrollo de servidor de alta concurrencia de Linux" 2.7 Salida del proceso, proceso huérfano, proceso zombie

Enlace de oferta exclusiva:

https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG

Supongo que te gusta

Origin blog.csdn.net/m0_38062470/article/details/113797732
Recomendado
Clasificación