2012-05-18 49 views
2

這是我用來執行shell命令的已清理的代碼。
儘管isExit始終爲0,並且循環應該運行,只要它是!isExit,我的程序將在執行一個循環後以命令ls作爲參數終止。
有沒有人有任何想法? 輸出正常(ls),但程序終止。代碼用C語言編寫,在Eclipse上。
在Ubuntu上運行12是在虛擬機上運行的Windows 7意外終止循環中運行的程序

int main() { 
    int numberOfCommands, numOfWords, i, isExit = 0, isBackGround = 0, isSucces; 
    char input[256]; 
    char *cmdAndArgs[256]; 
    char *commands[256]; 
do{ 
    // gets and parses user command... 
    ExecuteCmd(cmdAndArgs); 
    } while (!isExit); 
    return EXIT_SUCCESS; 
} 

void ExecuteCmd(char *cmdAndArgs[]){ 
    pid_t pid; 
    pid = fork(); 
    if (pid != 0) { 
     execvp(cmdAndArgs[0], cmdAndArgs); 
     exit(0); 
    } else { 
     waitpid(pid, &status, 0); 
    } 
} 
+0

程序可能因異常或崩潰而退出。嘗試把'printf(「isExit =%d」,(int)isExit);'在while循環之外,看看是否有東西被打印出來。 – sashoalm

回答

7

您正在父進程中運行execvp,而不是在子進程中。的邏輯:

pid_t pid; 
pid = fork(); 
if (pid != 0) { 
    execvp(cmdAndArgs[0], cmdAndArgs); 
    exit(0); 
} else { 
    waitpid(pid, &status, 0); 
} 

應調換到:

pid_t pid; 
pid = fork(); 
if (pid == 0) { /* Child */ 
    execvp(cmdAndArgs[0], cmdAndArgs); 
    exit(0); 
} else if (pid == -1) { 
    perror("fork"); 
} else { 
    waitpid(pid, &status, 0); 
} 

fork()的返回代碼爲:-1 ==叉失敗(使用errno確定的原因)。 0 ==我是孩子。 > 0 ==我是父母。請參閱返回值部分下的reference for fork

+0

+1。很好的接收。 – ArjunShankar

+0

就是這樣!你是個天才!!! – choppy

0

有沒有可能是你在// gets and parses user command...緩衝區溢出?如果您通過分配的空間寫入,則最終可能會覆蓋isExit的值