2013-03-07 5 views
0

Я пишу простую программу, чтобы лучше понимать fork(), wait() и execvp(). Моя проблема в том, что после запуска программы управление не возвращается обратно в оболочку, и я не знаю, почему. Я хочу, чтобы иметь возможность вводить другую команду в оболочку после завершения кода. Я взглянул на this, но я не думаю, что это применимо в моем случае. У меня есть только скопированный код, который я нашел от here.Потеря управления после fork()

ввода/вывода (# находится в передней части линий я типизированных, хотя и не является частью входа):

shell> # gcc test.c -o test 
shell> # ./test 
input program (ls) 
# ls 
input arg (.) 
# . 
test test.c extra.txt 
# a;dlghasdf 
# go back 
# :(

мой код:

int main(void) { 
    //just taking and cleaning input 
    printf("input program (ls)\n"); 
    char inputprogram [5] = {0,0,0,0,0}; 
    fgets(inputprogram,5,stdin); //read in user command 
    int i; 
    for(i = 0; i < 5; i++) { 
     if(inputprogram [i] == '\n'){ 
      inputprogram[i] = 0; 
     } 
    } 

    printf("input arg (.)\n"); 
    char inputarg [5] = {0,0,0,0,0}; 
    fgets(inputarg,5,stdin); //read in user command 
    for(i = 0; i < 5; i++) { 
     if(inputarg [i] == '\n'){ 
      inputarg[i] = 0; 
     } 
    } 

    char per []= {inputarg[0], 0}; 
    char *arg [] = {inputprogram, per , NULL}; 

    int status = 0; 
    pid_t child; 

    //the fork(), execvp(), wait() 
    ////////////////////////////////// 
    if ((child = fork()) < 0) { 
     /* fork a child process   */ 
     printf("*** ERROR: forking child process failed\n"); 
     exit(1); 
    } else if(child == 0){ 
     execvp(inputprogram, arg); 
     exit(1); 
    } else { 
     while(wait(&status != child)); 
    } 

    return EXIT_SUCCESS; 
} 

ответ

2

Эта линия

while(wait(&status != child)); 

неверен

Вам нужно

wait(&status); 

waitpid Или использовать - см here

+0

хорошо он работал. Почему мне не нужен цикл? Это потому, что у меня только один детский процесс? Я смотрел на это [http://stackoverflow.com/questions/2708477/fork-and-wait-with-two-child-processes], поэтому я запутался. – Daniel

+0

Как быть родителем, намного проще иметь один ребенок, которому нужно ухаживать. Если у вас есть два, вам нужна петля (глаза в затылке). –

Смежные вопросы