Jump to content
Fórum Script Brasil
  • 0

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


pierao
 Share

Question

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 to comment
Share on other sites

2 answers to this question

Recommended Posts

  • 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... :)

Edited by Marcelo Utikawa da Fonseca
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      150.8k
    • Total Posts
      648.7k
×
×
  • Create New...