2017-02-15 117 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 

請參閱「在此處查看」一行。新的提示符在那裏,但ls命令輸出稍後顯示。即使在命令輸出之前顯示提示,您的應用程序也會響應新命令。您可以通過使用不產生任何輸出命令驗證這一切,例如

osh> sleep 10 & 

哈努哈利

+0

這個順便說一句,在你的shell提示符下發出ls -al&命令。當新的shell提示符出現在中間的某個位置時,它通常在任何命令輸出之前都會出現「空」行。 – Hannu

+1

謝謝,我明白你的意思了! osh>出現較早,並不是因爲它不起作用,而是因爲它確實有效。我對它應該如何工作的期望只是關閉。非常感謝! –