【问题标题】:Keep parent process in foreground after fork分叉后将父进程保持在前台
【发布时间】:2013-08-22 19:54:50
【问题描述】:

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

我的问题是,在 fork 之后,父进程移动到 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$

【问题讨论】:

  • if (pid) { // child 错误。父进程返回一个非零 pid,子进程返回一个零 1。

标签: c fork tty


【解决方案1】:

th pid 在父级中返回,所以你的条件应该是

if (!pid)

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

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

【讨论】:

  • 好电话,这就是问题所在。
  • 我会的。它说“您可以在 5 分钟内接受答案”。
【解决方案2】:

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

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

所以如果孩子想要执行,你必须将 if 条件更改为

if(!pid)

更多详情man fork

【讨论】:

    【解决方案3】:

    初期问题

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

    迫在眉睫的问题

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

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

    【讨论】:

    • 我认为在 wait() 周围添加一个循环不会解决我的问题。首先,只有一个子进程,所以一个等待就足够了。其次,即使我将等待移到程序的底部(假设孩子运行了很长时间),我希望父母留在 fg 中。
    • 修复子/父识别过程后,循环变得相关。假设您希望父进程等待其所有(直接)子进程退出。由于孩子们很快退出,无论您是在sleep() 中等待还是在wait() 周围循环都无关紧要。如果你改变了孩子,让他们在退出之前持续了一段时间(比如超过 3 秒),那么循环就会很重要。
    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2012-02-19
    • 2012-08-04
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多