• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

j0mi

Utilização de fork, execlp e wait

2 mensagens neste tópico

Boa noite a todos.

Tenho que fazer um programa em C com o seguinte enunciado, se alguém me puder dar uma ajuda agradecia... Supostamente tenho que ter algo que controle o "filho" sem chamar o "pai" para ver se algum falha

Enunciado:

Implementar um programa em C que tome como parametros nomes de programas que têm que se executar. Mediante o uso de fork(), execlp() e wait() o programa detectará quando termina de forma anormal algum dos filhos para voltar a executá-los.

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

// int execl(const char *pathname, const char *arg0, …); Significa execute and leave, i.e. executa e termina o comando indicado pelo pathname com as opções indicadas pelos restantes argumentos da função
// int wait(int status_location); Força o progenitor a esperar pela paragem ou terminação do progénito. Esta função devolve o pid do progénito ou –1 no caso de erro. O estado de exit do progénito é devolvido a status_location.

main(int argc, char *argv[])
{
int i, pid, status;

for (i = 1; i < argc; i++)
{
	if ((pid = fork()) < 0)
        {
         	printf("Erro ao criar o processo filho\n");
      		exit(1);
        }

        if (pid == 0)
        {

		if (execl(argv[i], argv[i], "-a", NULL) == -1) 
		{
      			printf("Erro ao criar o processo filho\n");
		}	

		else
		{
			pid = fork();
			if (wait(&status) == -1) // se o wait devolver -1 sabemos que o filho terminou de forma inesperada
			{
				printf ("Erro!");
				execl(argv[i], argv[i], "-a", NULL);
			}
		}

        }

         else 
{
	if ( wait(&status) == -1 )
	{
		pid = fork();
	}
}
}
}

Qualquer ajuda é muito bem vinda uma vez que é o inicio de um projecto e se começa mal já :bye2:

Thanks in advance ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Por acaso tenho um exercicio +- feito sobre isso, mas não executa de novo o comando se falhar.

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

int main(int argc, char * argv[])
{
pid_t pid, pid2;
int estado, i, k;

for(i=1;i<=argc;i++){

	pid = fork();

	if(pid == 0){
		execlp(argv[i], argv[i], NULL);	
		puts("ERRO");
		exit(0);
	}
	puts("");
}

sleep(1);
puts("Processo pai");
for(k=0;k<argc;k++){
	pid2 = wait(&estado);
}
puts("Executei os outros programas e agora estou no original");

return 0;
}

Para executar o comando em caso de erro só tinhas de voltar a invocar a função exec depois do puts("ERRO");

Mas não sei bem se é isso que o enunciado pede.  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora