после того, как управление fork / execvp не возвращается к родителю - PullRequest
1 голос
/ 28 сентября 2011

когда я запускаю свой код ниже и набираю «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");
    }
}

1 Ответ

1 голос
/ 28 сентября 2011

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

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

...