Ir ao conteúdo

Posts recomendados

Postado

Gente, estou tentando criar um programa que criar A, B, C, D e E, sendo o A o processo pai. o programa tem que fica num loop infinito imprimindo o nome do processo e seu id e a cada 5 segundos o processo pai(A) matar um filho na ordem B, C, D, E.

Quando todos os filhos tiverem mortos o processo pai imprimir a mensagem "não tenho mais filhos" e finaliza o programa. 

 

A minha dúvida é, não estou conseguindo matar os processos filhos. O código fica em loop infinito e nunca termina. 

 

#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>


int main(void) {

    wait(NULL);
    printf("Não tenho mais filhos.\n");


    while(1){
        if(fork()){ //B
            printf("B | ID = %d\n", getpid());
            kill( getpid(), SIG_TERM);
        }
        if(fork()){ //C
            printf("C | ID = %d\n", getpid());
        }
        if(fork()){ //D
            printf("D | ID = %d\n", getpid());
        }
        if(fork()){ //E
            printf("E | ID = %d\n", getpid());
        }
    }

    return 0;
}

 

  • Obrigado 1
Postado
22 horas atrás, ytalopaulo_ disse:

O código fica em loop infinito

 

pode ser o efeito do while(1)... 

 

Citação

Cuidado com esse tipo de programa: esses programas que usam fork() mais de uma vez são boas maneiras de parar sua máquina. Ou pior, parar a máquina de alguém. É o efeito conhecido como fork bomb em que cada processo gera uma cópia e cada cópia gera várias cópias até parar a máquina.

 

Não rode isso no IDE. Em geral ele se perde.

 

Não rode isso em Windows. fork() é Unix --- e linux, MacOS, Android. 

 

De volta ao seu programa
 

int main(void) {

    wait(NULL);
    printf("Não tenho mais filhos.\n");

...

 

Que pretende com isso? Acabou de iniciar main() e vai esperar pelo que? wait() vai retornar apenas... E claro que não tem mais filhos, acabou de começar. E o printf() nem é condicional: vai imprimir sempre isso.

 

       if(fork()){ //B
            printf("B | ID = %d\n", getpid());
            kill( getpid(), SIG_TERM);
        }
        if(fork()){ //C
            printf("C | ID = %d\n", getpid());
        }

 

Essa parte não entendi mesmo: o printf() "B" vai rodar no pai. O nome do sinal está escrito ERRADO. Não vai dar em nada. Mas se fosse SIGTERM ia cancelar A SI MESMO. Uma versão de exit().

 

Só que o fork() criou outro processo, e esse vai rodar o fork() seguinte, e cada cópia vai gerar outras até parar a sua máquina...

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!