2

这是我用来执行 shell 命令的清理代码。
虽然isExit总是 0 并且循环应该运行,只要它是!isExit,我的程序在一个循环后终止,命令ls作为要执行的参数。
有谁有想法吗?输出正常(ls),但随后程序终止。代码是在 Eclipse 上用 C 语言编写的。
在 Ubuntu 12 上运行,该 Ubuntu 12 在 Windows 7 上的 VM 上运行。

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

2 回答 2

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 failed(用于errno确定原因)。0==我是孩子。> 0== 我是家长。请参阅返回值部分下的fork 参考。

于 2012-05-18T12:33:39.003 回答
0

是否有可能出现缓冲区溢出// gets and parses user command...?如果你写超出了分配的空间,你最终可能会覆盖isExit

于 2012-05-18T12:27:41.433 回答