2

我目前正在尝试在 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;

}

4

1 回答 1

6

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

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

于 2013-04-25T13:49:37.570 回答