2015-05-10 144 views
2

我們正在創建一個簡單的shell進程。fork並等待子進程好像根本沒有在等待

這裏是代碼:

pid = fork(); 

     if (pid == -1) { 
      printf("fork error"); 

     }else if (pid > 0) { 
      wait(&status); 

     } 

     else if (pid == 0) { 
      execute(myarg); 

     } 

,這裏是執行功能: 無效執行(INT ARGC){

switch (argc) { 

case 1: 
    execlp(arg[0], arg[0], NULL); 
case 2: 
    execlp(arg[0], arg[0], arg[1], NULL); 
case 3: 
    execlp(arg[0], arg[0], arg[1], arg[2], arg[3], NULL); 
case 4: 
    execlp(arg[0], arg[0], arg[1], arg[2], arg[3], arg[4], NULL); 
default: 
    printf("Error in switch\n"); 
} 

我的問題是正常,如果我們滿足的情況下1〜4,沒有問題。但如果我們遇到了默認值,退出shell的硬代碼只有在我用類似exit的「Error in switch」輸入exit時纔有效。幫我!!!

結果時,我沒有得到「錯誤的開關」:

kevinshell>> ls 
myshellw.c posix posix.c posix.c~ shell-l.c~ test test.c` 
kevinshell>> exit 

,這裏是當出現錯誤:

kevinshell>> stuff 
Error in switch 
kevinshell>> stuff 
Error in switch 
kevinshell>> another 
Error in switch 
kevinshell>> exit 
kevinshell>> exit 
kevinshell>> exit 
kevinshell>> exit 
+0

恕我直言,你應該看看'exec vp',這是專爲任意參數編號... –

回答

2

你必須在默認的printf後調用exit案件。否則,你的子進程永遠不會退出...

這個工程的情況下,1-4的原因是,高管*呼叫與請求的程序,並最終取代當前的進程映像,該程序調用exit

從人EXEC:

The exec() family of functions replaces the current process image with a new process image. The functions described in this manual page are front-ends for execve(2). (See the manual page for execve(2) for fur‐ ther details about the replacement of the current process image.)

如果您發佈完整的代碼,我就可以進一步解釋孩子是printf的行之後做什麼(我猜它再次作爲一個正常的外殼會在運行此代碼fork了一個循環)

+0

!!!!!!有用!!!!! –

+0

我加了_Exit();在printf結尾並退出!謝謝!! –

+0

非常歡迎你(; –