fork()函数永远不会返回0

时间:2013-04-25 13:24:04

标签: c linux

我目前正在尝试在C中运行fork函数,在代码的子部分, 我试图使用exacvp执行命令,但在执行之前我正在尝试一个永远不会执行的printf函数。我在调试中运行了这个,我注意到pid永远不会被分配0.我在一个单独的项目上尝试了一个简单的fork示例,它运行顺利。有没有人知道为什么子部分永远不会执行?

int startProcesses(int background) {
int i = 0;

while(*(lineArray+i) != NULL) {
    int pid;
    int status;
    char *processName;

    pid = fork();

    if (pid == 0) {

        printf("I am child");
        // Child Process
        processName = strtok(lineArray[i], " ");
        execvp(processName, lineArray[i]);
        i++;
        continue;

    } else if (!background) {

        // Parent Process
        waitpid(pid, &status, 0);
        i++;
        if(WEXITSTATUS(status)) {
            printf(CANNOT_RUN_ERROR);
            return 1;
        }
    } else {
        i++;
        continue;
    }
}
return 0;

}

1 个答案:

答案 0 :(得分:6)

stdio文件在程序退出时刷新,但execvp直接用另一个映像替换该进程,绕过flush-at-exit机制并将I am child消息留在内存中永远不会发送到屏幕。在fflush(stdout)之前添加明确的execvp,或者使用\n结束字符串,以便在TTY上运行时自动刷新。

请注意,execvp永远不会退出,如果是,则是因为它无法执行新进程。此时,孩子可以做的唯一事情是报告错误并调用_exit(127)(或类似的退出状态)。如果子进程继续,则配置错误的命令名将导致它与父进程并行执行父进程的其余部分。这个过程将继续为其他后代,有效地创建一个可以使你的系统停止运转的叉炸弹。