2014-02-22 66 views
0

我使用「int flag = [0或1]」來確定我的循環是否應該返回到do {}。 繼承人我的代碼我做錯了什麼,以結束此循環

void shell() 
{ 
    int flag = 1; 
    do 
    { 
     // Retrieve PID of the parent process. 
     pid_t shell_pid = getpid(); 

     // Print shell prompt. 
     printf("{%i}$ ", shell_pid); 

     // Retrieve input from stdin. 
     char* input = NULL; 
     size_t input_size = 0; 
     getline(&input, &input_size, stdin); 
     char delim = ' '; 
     char **argvp; 
     int argc = makeargv(input, &delim, &argvp); 

     // Remove \n from last arg 
     char* lastarg = argvp[argc - 1]; 
     while(*lastarg && *lastarg != '\n') 
      lastarg++; 
     *lastarg = '\0'; 

     // Create a child process to handle user input. 
     pid_t pid = fork(); 

     // Parent process. 
     if (pid != 0) 
     { 
      wait(NULL); 
     } 
     else // Child process 
     { 
      int i; 
      // Handle user input here! 

      //got some debugging tools here 
      printf("========DEBUG==========\n"); 
      printf("There are %i args\n", argc); 
      for(i = 0; i < argc; i++) 
      { 
       printf("arg %i: \"%s\"\n", i, *(argvp + i)); 
      } 
      printf("=====END DEBUG==========\n\n"); 
      printf("********OUTPUT*********\n"); 
      //handle "echo" here 
      if((i = strcmp(argvp[0],"echo")) == 0) 
      { 
       echo(argc, argvp); 
      } 

      //handle "exit" or "quit" here 
      if((i = strcmp(argvp[0],"exit")) == 0 || (i = strcmp(argvp[0],"quit")) == 0) 
      { 
       printf("got in the exit\n"); 
       flag = 0; 
      } 

     } 
     printf("****END OUTPUT*********\n"); 
     // Free memory allocated by getline(). 
     free(input); 
    }while(flag == 1);  
} 

和我的輸入/輸出如下:輸入前綴$]

$ ./shelltest 
{13158}$ try first string 
========DEBUG========== 
There are 3 args 
arg 0: "try" 
arg 1: "first" 
arg 2: "string" 
=====END DEBUG========== 

********OUTPUT********* 
****END OUTPUT********* 
{13159}$ echo try another 
========DEBUG========== 
There are 3 args 
arg 0: "echo" 
arg 1: "try" 
arg 2: "another" 
=====END DEBUG========== 

********OUTPUT********* 
try another 
****END OUTPUT********* 
{13160}$ quit 
========DEBUG========== 
There are 1 args 
arg 0: "quit" 
=====END DEBUG========== 

********OUTPUT********* 
got in the exit 
****END OUTPUT********* 
****END OUTPUT********* 
{13160}$ 

由於「在出口處得到了」輸出結果顯示,則標誌是立即設置爲0. 循環如何繼續?

+2

是什麼讓你說循環繼續? – user2357112

+0

,因爲我被重新提示輸入「{13160} $」 –

回答

4

您使用fork(),父進程等待子進程退出,行:

printf("****END OUTPUT*********\n"); 

由父和子進程都執行,所以你看到它的兩倍。

1

您的過程正在退出循環,但您的父母繼續運行。

shell的正常範例是爲父級讀取和評估輸入,並且只有在需要子進程時才分叉。

使用該方法,父母將檢測到exit並完成而不創建子女。

1

當您打印

{13160} $退出

在現實中,13160是將由叉創建處理退出命令的進程的父進程的PID(要看到這個動作,在叉子後打印孩子的pid)。這一個將解析退出並通過將標誌設置爲0退出。然後您將看到****END OUTPUT*********兩次。

你必須記住,當你fork時,內存不會與父級共享(在Linux中它是寫入時的複製,這是我上次讀的時候),所以當子寫入flag = 0時,父級將不會看到這個值,所以它會再次循環。因此爲什麼它再次要求輸入。

你處理關係的另一件事看起來像{13158}->{13159}->{13160}->...由於root進程是13158,我認爲你想要做的是在每次輸入後從根產生一個孩子。所以你可能想檢查一下。