Pergunta

Oi Eu estou trabalhando em um shell unix e eu estou correndo em dois problemas. Eu queria saber se algum de vocês poderia me ajudar. Meu primeiro problema é que a casca não está aguardando o processo filho para terminar. Eu posso realmente ir digite mais comandos enquanto o processo filho está em execução. Minhas segundas problemas está nas duas linhas seguintes. Eu não estou recebendo qualquer exibição na casca.

    fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
    fprintf(stderr, "Child pid = %d\n", pid);

I têm o seguinte método para executar um processo introduzidos pelo utilizador: isto é firefox, sl -a, etc

void execute(char *command[], char *file, int descriptor){
    pid_t pid;
    pid = fork();

    if(pid == -1){
        printf("error in execute has occurred\n");
    }
    if(pid == 0){           
        execvp(*command,command);
        fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
        fprintf(stderr, "Child pid = %d\n", pid);
        wait(&status);
            exit(EXIT_SUCCESS);
    }
    else{
        printf("ignore for now\n");
    }
}

Este é o lugar onde eu chamo o comando executar. Ele funciona muito bem e lançamentos de um processo, mas não esperar que ela termine.

 execute(commandArgv, "STANDARD",0);

Vocês têm alguma idéia do que eu poderia estar fazendo de errado? Graças Eu realmente aprecio qualquer momento que você tomar para me ajudar nisso.

Foi útil?

Solução

Uma vez execvp () é executado, ele nunca vai voltar. Ele substitui na memória o aplicativo em execução com o que foi fornecido. Portanto, o seu fprintf () e wait () estão no lugar errado.

Outras dicas

Além de obter a lógica real funcionou corretamente (sugestões de Stephane tudo de bom), você pode também querer fflush (stderr), depois, para garantir suas mensagens de erro-ing fprintf fazê-lo fora imediatamente em vez de ser tamponado.

Você tem um pequeno erro na forma como o processo funciona. Depois execvp é chamado, não há como voltar atrás. fork () lhe dá ter o pai e uma criança idêntica, mas execvp imagem Criança de substituição para ser o comando que você está chamando.

O execvp retorna somente quando um graves ocorrem erros que impedem a substituição da imagem. Então, você precisa imprimir coisas antes de sua chamada. Então você também pode querer mudar o EXIT_SUCCESS para um EXIT_FAILURE lá.

Agora, há outro erro usando espera : você quer sempre a espera dos pais para a criança, e não o contrário. Você não pode pedir para que a criança espera. Ela não tem nada a espera, ela vai correr e terminar. Então, você precisa mover o wait () chamada para o else parte.

void execute(char *command[], char *file, int descriptor)
{
    pid_t pid;
    pid = fork();

    if(pid == -1)
    {
        printf("fork() error in execute() has occurred\n");
        return; /* return here without running the next else statement*/
    }
    if(pid == 0)
    {           
        fprintf(stderr, "Process name is: %s\n", commandArgv[0]);
        fprintf(stderr, "Child pid = %d\n", getpid());
        execvp(*command,command);
        fprintf(stderr, "Error! Can't overwrite child's image!\n");
        exit(EXIT_FAILURE);
    }
    else
    {
        printf("Parent waiting for child pid: %d\n", pid);
        wait(&status);
        printf("Parent running again\n");
    }
}

Mas ler sua pergunta, talvez você realmente não quer que o pai para esperar. Se for esse o caso, simplesmente não usar o wait () função.

cuidar, Beco

Editado: alguns erros menores. pid da criança é getpid ()

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top