[英]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.