Ir para conteúdo
Fórum Script Brasil
  • 0

N filhos que executam N files. alguém me da uma luz ?


pierao

Pergunta

queria enteder de uma vez por todas como funcionam certas coisas no C:

eu tenho que fazer um programa que recebe na linha de comando assim:

nome_do_prog NUMERO file1 file2 ... fileN

-o NUMERO sera' o numero de filhos que deverao ser criados e executarao os N primeiros files da linha de comando.

Eu cheguei a fazer a primeira parte que é pegar do argv[] os seus valores e colocar dentro de variaveis pra poder chamar uma funcao denominada paralelo(int num; char executable[255]) onde serao executados os N files.

-Vamos ao que interessa:

int main(int argc, char** argv)
{
int j, x, m, n, cont;
int k;
char* comandi[255] = {NULL};


k=atoi(argv[1]);

printf("K vale %d\n", k);

for(cont=0;cont<k+1;cont++)
    { 
    comandi[cont]=strdup(argv[cont+1]);
    printf("copiado o file para execucao em paralelo: %s\n ", comandi[cont]);
    }
x=paralelo(k, comandi[255]);
essa primeira parte coloca o valor de argv[1] em k e nome dos files em um vetor chamado comandi[] Com esses 2 vetores eu chamo uma funcao chamada paralelo(k, comandi[255]) :
int paralelo(int num, char executable[255]) // ta certa essa chamada do programa ??? Acho q da dando tudo errado quando eu chamo ele com " paralelo(k, comandi[255])"
{
int i,pid,status, morte;
char files[255];

    printf("Serao criados %d filhos em paralelo\n", num);
    for(i=0;i<num;i++)
        {
        pid=fork();
        if(pid==0)
            {
            printf("%s\n", files[i]);
                        
            execl("????"); // AQUI: como faço para que o filho execute o programa que tem o nome armazenado em executable[] ???
             exit(0);
            }
        if(pid!=0)
            {
            morte=wait(&status);
            printf("E morto il figlio %d\n", morte);
            }
        }
return(0);
}

preciso de achar um modo para que cada filho no ciclo for execute o arquivo que foi passado a executable[255]

Acho q a chamada do programa paralelo(k, comandi[255]) ta errada.

alguém me da uma luz ?

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Com relação às suas dúvidas:

Os parâmetros passados para uma função devem ser exatamente como os parâmetros declarados.

Assim, uma função declarada como:

int soma(int a, int b);
Não pode ser chamada com:
soma("txt1", "txt2"):
Desta forma, quando você chama a função paralelo, deve passar a ela um parâmetro que ela aceite. Ela é declarada como:
int paralelo (int num, char executable[255]);
No seu código main você declarou:
char * commandi[255];
Veja que o tipo de variável que você criou é diferente da que a função recebe. Este é o primeiro problema. Agora você deve estar imaginando: "mas compilou aqui!". Realmente compilou mas por uma coincidência: quando você chamou a função paralelo, o parâmetro passado para ela não foi commandi mas sim commandi[255]. Isso quer dizer que você passou para a função o elemento de número 256 (os índices em linguagem C iniciam de zero). E o que é o elemento 256? É um char* pois essa variável foi declarada como um vetor de char*. Assim, como char* é compatível com o parâmetro recebido pela função (char[255]), então compila e roda, mas não funciona. Este é o segundo problema. O correto seria criara função como abaixo:
int paralelo (int num, char *executable[255])
E chamar a função da seguinte forma:
paralelo(k,commandi);
Quanto a execl: nessa função você passa o programa que será chamado seguido dos parâmetros:
execl("notepad.exe", "arquivo.txt", NULL);

Veja que o último parâmetro deve sempre ser nulo para indicar o fim da lista de parâmetros.

No seu programa eu não sei como você precisa chamar a função.

Cada fileN é um programa (como notepad.exe) que deve ser executado ou um arquivo para ser passado como parâmetro a algum programa (como arquivo.txt)?

A sua resposta já te diz como usar a execl... :)

Editado por Marcelo Utikawa da Fonseca
Link para o comentário
Compartilhar em outros sites

  • 0
Com relação às suas dúvidas:

Os parâmetros passados para uma função devem ser exatamente como os parâmetros declarados.

Assim, uma função declarada como:

int soma(int a, int b);
Não pode ser chamada com:
soma("txt1", "txt2"):
Desta forma, quando você chama a função paralelo, deve passar a ela um parâmetro que ela aceite. Ela é declarada como:
int paralelo (int num, char executable[255]);
No seu código main você declarou:
char * commandi[255];
Veja que o tipo de variável que você criou é diferente da que a função recebe. Este é o primeiro problema. Agora você deve estar imaginando: "mas compilou aqui!". Realmente compilou mas por uma coincidência: quando você chamou a função paralelo, o parâmetro passado para ela não foi commandi mas sim commandi[255]. Isso quer dizer que você passou para a função o elemento de número 256 (os índices em linguagem C iniciam de zero). E o que é o elemento 256? É um char* pois essa variável foi declarada como um vetor de char*. Assim, como char* é compatível com o parâmetro recebido pela função (char[255]), então compila e roda, mas não funciona. Este é o segundo problema. O correto seria criara função como abaixo:
int paralelo (int num, char *executable[255])
E chamar a função da seguinte forma:
paralelo(k,commandi);
Quanto a execl: nessa função você passa o programa que será chamado seguido dos parâmetros:
execl("notepad.exe", "arquivo.txt", NULL);

Veja que o último parâmetro deve sempre ser nulo para indicar o fim da lista de parâmetros.

No seu programa eu não sei como você precisa chamar a função.

Cada fileN é um programa (como notepad.exe) que deve ser executado ou um arquivo para ser passado como parâmetro a algum programa (como arquivo.txt)?

A sua resposta já te diz como usar a execl... :)

Perfeito seu reply!!!

você é o cara!!!

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...