2.7 Saída do processo, processo órfão, processo zumbi

índice

1. Saída do processo

2. Processo órfão

3. Processo de zumbi


1. Saída do processo

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

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

Procedimento para testar a função de saída:

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

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

resultado da operação:

Procedimento para testar a função _exit:

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

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

resultado da operação:

Por que há uma diferença entre os dois resultados de saída?

A primeira instrução printf com "\ n" atualizará o buffer. Portanto, ambos os programas exibem "hello".

A segunda instrução printf não tem "\ n". Pela primeira figura, podemos ver que a função de saída atualizará o buffer, e a função _exit não atualizará o buffer, então o primeiro programa também produzirá world, mas o segundo programa não.


2. Processo órfão

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 da operação:

 

Quando um programa executável é executado no terminal, ele mudará para a execução do programa por padrão, razão pela qual a saída do programa é exibida no terminal.

Entre eles, o id 12145 do processo pai do processo pai no programa é o terminal atual, que pode ser verificado:

Porque o terminal é o processo pai do processo pai no programa, o terminal sabe quando o processo pai no programa termina e volta para o terminal após o processo pai no programa terminar, então ele exibirá o quadro vermelho em a figura anterior. parte. Mas o terminal não sabe se o processo pai tem um processo filho que terminou de ser executado, portanto, o conteúdo do processo filho no programa será exibido mais tarde. Por que a saída do processo filho também é exibida no terminal atual? Porque após a bifurcação, a tabela do descritor de arquivo do processo filho e do processo pai são os mesmos (compartilhados durante a leitura), representando o mesmo terminal.

O processo órfão será adotado pelo processo init cujo ID de processo é 1 e o init completará a liberação de recursos do processo órfão. O processo órfão é inofensivo.


3. Processo de zumbi

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 da operação:

Use ps aux para visualizar as informações do processo, conforme mostrado abaixo:

Pode-se ver na figura que o processo filho 12216 é um processo zumbi. Como o processo filho terminou a execução, o processo pai não recuperou os dados da área do kernel do processo filho e o processo pai está em execução. Os processos zumbis vêm ocupando recursos do sistema, então devemos encontrar uma solução.

Uma das soluções:

Deixe o processo pai terminar de ser executado:

Porque depois que o processo pai termina, o processo pai do processo filho (ou seja, o processo zumbi) se tornará o processo init, e o processo init irá recuperar os recursos do processo zumbi.

Na verdade, às vezes o programa precisa estar em execução o tempo todo e não pode ser encerrado com ctrl + c.

Solução dois:

A função de espera ou função waitpid é chamada no processo pai para reciclar os recursos do processo filho. Este método será discutido posteriormente.


Referência: Niuke.com C ++ projeto de pesquisa de empregos bem pagos "Linux High Concurrency Server Development" 2.7 saída do processo, processo órfão, processo zumbi

Link de oferta exclusiva:

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

Acho que você gosta

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