簡體   English   中英

循環中意外終止程序

[英]unexpected termination of program running in a loop

這是我為了執行Shell命令而使用的干凈代碼。
盡管isExit始終為0,並且循環應該一直運行,只要它是!isExit ,我的程序將在循環執行后以命令ls作為參數終止。
有人有什么主意嗎? 輸出正常(ls),但程序終止。 該代碼在Eclipse上用C編寫。
運行在通過Windows 7在VM上運行的Ubuntu 12上。

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);
    } 
}

您在父進程而不是子進程中運行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 == fork失敗(使用errno確定原因)。 0 ==我是孩子。 > 0 ==我是父母。 請參閱“返回值”部分下有關派生參考

// gets and parses user command...是否有緩沖區溢出// gets and parses user command... 如果寫超出了分配的空間,則最終可能會覆蓋isExit的值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM