意外终止程序在循环中运行

时间:2012-05-18 12:24:21

标签: c linux ubuntu-11.10

这是我正在使用的清理代码,用于执行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);
    } 
}

2 个答案:

答案 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

的值