3

我有一个分叉子进程的 C 程序,我从 linux shell 运行它。

我的问题是,在分叉之后,父进程移动到 shell 后台。我希望父进程留在前台。

这是一个简单的例子:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(void)
{
    int i;
    for (i = 0; i < 3; i++) {
        printf("Before Fork\n");
        sleep(1);
    }

    printf("forking...\n");
    pid_t pid = fork();
    if (pid) {
        // child
        printf("Child started and now exiting\n");
        exit(EXIT_SUCCESS);
    }

    // parent
    wait(NULL);
    for (i = 0; i < 3; i++) {
        printf("After Fork\n");
        sleep(1);
    }

    return 0;
}

输出(稍后添加评论)

Before Fork
Before Fork
Before Fork
forking...
Child started and now exiting
After Fork
gregp@gregp-ubuntu:~/fork_example$ After Fork       # <--- User returned to shell
After Fork

请注意,在 fork 之后不久,用户返回到 shell 提示符,程序继续在后台运行。我不希望这种情况发生。我希望程序继续在前台运行。

期望的输出(稍后添加评论)

Before Fork
Before Fork
Before Fork
forking...
Child started and now exiting
After Fork
After Fork
After Fork
                 # Program now exits and user returns to shell
gregp@gregp-ubuntu:~/fork_example$
4

3 回答 3

3

th pid 在父级中返回,因此您的条件应该是

if (!pid)

因为你的代码中的孩子不会去如果。那是因为

成功时,父进程返回子进程的PID,子进程返回0。失败时,在父进程中返回 -1,不创建子进程,并适当设置 errno。

于 2013-08-22T19:58:19.617 回答
2

fork() 成功时返回 0 给子进程。

当条件为零时,if 循环不会执行。

所以如果孩子想执行你必须改变 if 条件

if(!pid)

更多细节man fork

于 2013-08-22T20:01:08.027 回答
1

初期问题

您需要围绕wait(). 正如所写,它等待一个孩子完成(忽略返回的 PID 并且不设置状态)。shell 的wait命令与系统调用不同——但代码看起来好像是与 shell 的命令类比编写的。

即时问题

首先由其他人识别 - 请他们获得荣誉。

循环问题仅在wait()您修复if (pid)测试后才相关......我想知道如果您写错了,您是否会犯错误if (pid == 0) { // Child?可能不是; 您知道将fork()孩子的 PID 返回给父母,将零返回给孩子。明确性有帮助。

于 2013-08-22T19:57:08.283 回答