2017-02-15 16 views
1

У меня есть программа, которая, кажется, висит в родительском процессе. Это макетная программа bash, которая принимает команды типа bash, а затем управляет ими. Код ниже. (Обратите внимание упрощена код без проверки, так что это будет более легко читаемым ошибка. Предположим, его все правильно вложены внутри основной функции)Процесс зависает в родительском процессе в C

#define MAX_LINE 80 

char *args[MAX_LINE/2 + 1]; 
while(should_run){ 
    char *inputLine = malloc(MAX_LINE); 
    runConcurrently = 0; /*Resets the run in background to be line specific */ 

    fprintf(stdout, "osh> "); /*Command prompt austhetic */ 
    fflush(stdout); 

    /*User Input */ 
    fgets(inputLine, MAX_LINE, stdin); 

    /*Reads into Args array */ 
    char *token = strtok(inputLine, " \n"); 
    int spot = 0; 
    while (token){ 
     args[spot] = token; 
     token = strtok(NULL, " \n"); 
     spot++; 
    } 
    args[spot] = NULL; 

    /* checks for & and changes flag */ 
    if (strcmp(args[spot-1], "&") == 0){ 
      runConcurrently = 1; 
      args[spot-1] = NULL; 
    } 


    /* Child-Parent Fork Process */ 
    pid_t pid; 
    pid = fork(); /*Creates the fork */ 
    if (pid == 0){ 
     int run = execvp(args[0], args); 
     if (run < 0){ 
      fprintf(stdout, "Commands Failed, check syntax!\n"); 
      exit(1); 
     } 
    } 
    else if (pid > 0) { 
     if (!runConcurrently){ 
      wait(NULL); 
     } 
    } 
    else { 
     fprintf(stderr, "Fork Failed \n"); 
     return 1; 
    } 
} 

Проблема здесь связана с тем, когда я использую «&» и активировать запустить флажок одновременно. Это делает так, чтобы родитель больше не должен был ждать, однако, когда я это делаю, я теряю некоторые функции.

Ожидаемый результат:

osh> ls-a & 
//Outputs a list of all in current directory 
osh> 

Так что я хочу, чтобы запустить их concurently, но передать управление терминалом обратно ко мне. Но вместо этого я получаю это.

Фактический результат:

osh> ls -a & 
//Outputs a list of all in current directory 
    <---- Starts a new line without the osh>. And stays like this indefinitely 

И если я что-то типа в эту пустую область результат:

osh> ls -a & 
//Outputs a list of all in current directory 
ls -a 
//Outputs a list of all in current directory 
osh> osh> //I get two osh>'s this time. 

Это мой первый раз, работая с разделенными процессами и вилкой(). Я что-то упустил? Когда я запускаю его одновременно, я должен выбирать процессы или что-то в этом роде? Любая помощь приветствуется, спасибо!

+0

если добавить '\ n' к быстрой линии, она работает, как ожидалось? –

ответ

3

Ваш код действительно работает нормально. Единственная проблема заключается в том, что вы выливаете подсказку «слишком быстро», и перед выходом команды появляется новое приглашение. См. Тестовый результат здесь:

osh> ls -al & 
osh> total 1944 --- LOOK HERE 
drwxrwxrwt 15 root root  4096 Feb 15 14:34 . 
drwxr-xr-x 24 root root  4096 Feb 3 02:13 .. 
drwx------ 2 test test  4096 Feb 15 09:30 .com.google.Chrome.5raKDW 
drwx------ 2 test test  4096 Feb 15 13:35 .com.google.Chrome.ueibHT 
drwx------ 2 test test  4096 Feb 14 12:15 .com.google.Chrome.ypZmNA 

См. Строку «LOOK HERE». Появится новое приглашение, но позже появится вывод команды ls. Ваше приложение реагирует на новые команды, даже если приглашение отображается перед выходом команды. Вы можете проверить все это с помощью команды, которая не производит никакого вывода, например

osh> sleep 10 & 

Ханну

+0

Этот бит работает одинаково с выдачей команды ls -al & в командной строке оболочки. Это оставляет вас также с «пустой» строкой, так как новое приглашение оболочки появляется где-то посередине, обычно перед выходом любой команды. – Hannu

+1

Спасибо, я понимаю, что вы имеете в виду! Osh> появляется раньше, а не потому, что он не работает, а потому, что он работает. Мое ожидание того, как это должно работать, было просто выключено. Спасибо! –