после fork/execvp управление не возвращается к родителю

когда я запускаю свой код ниже и набираю «ls» в приглашении, он запускает ls в терминале, но затем просто сидит там и больше не печатает мое приглашение. Как мне получить контроль, чтобы вернуться к родительскому процессу?

Спасибо

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

int main(int argc, char* argv[]){
    while(1){
        print_the_prompt();
        char user_text[100];
        if( fgets(user_text, sizeof(user_text), stdin) != NULL ){
            char* nl_char = strchr(user_text, '\n');
            if( nl_char != NULL ){
                *nl_char = '\0';
            }
        }

    //printf("user_text = \"%s\"\n", user_text);

        if( is_command_built_in(user_text) ){
            //run built in command
        }
        else{
            //run regular command
            execute_new_command(user_text);
        }
    }

    return 0;
}

void print_the_prompt(){
        printf("!:  ");
}

int is_command_built_in(char* command){
    return 0;
}

void execute_new_command(char* command){
    pid_t pID = fork();
    if(pID == 0){
        //is child
        char* execv_arguments[] = { command, (char*)0 };
        execvp(command, execv_arguments);
    }
    else{
        //is parent
        printf("im done");
    }
}

person james    schedule 28.09.2011    source источник


Ответы (1)


Ответ, вероятно, заключается в том, что родитель печатает «im done» сразу после запуска дочернего процесса (помните, что это отдельный процесс и, следовательно, выполняется параллельно), а затем повторяется, чтобы напечатать подсказку еще до того, как дочерний процесс начинает перечислять файлы. Если вы прокрутите назад, вы, вероятно, найдете следующую подсказку.

Чтобы родитель дождался завершения дочернего процесса, вам придется использовать одну из функций семейства wait().

person Greg Hewgill    schedule 28.09.2011
comment
ооооо ок. Я не знал о wait(). Я посмотрю на это. Вы были правы, он напечатал «Я готов» до того, как напечатал материал из ls. - person james; 28.09.2011