这是我正在使用的清理代码,用于执行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);
}
}
答案 0 :(得分: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
== fork失败(使用errno
确定原因)。 0
==我是孩子。 > 0
==我是父母。请参阅返回值部分下的reference for fork。
答案 1 :(得分:0)
// gets and parses user command...
中是否有缓冲区溢出?如果您写过分配的空格,则最终可能会覆盖isExit