índice
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