在fork之后将父进程保持在前台

时间:2013-08-22 19:54:51

标签: c fork tty

我有一个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$

3 个答案:

答案 0 :(得分:3)

在父母中返回pid,因此您的条件应为

if (!pid)

因为代码中的孩子不会转到if。那是因为

  

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

答案 1 :(得分:2)

fork()在成功时将0返回到子进程。

如果条件为零,则不执行循环。

因此,如果孩子想要执行,则必须将条件更改为

if(!pid)

进一步详情man fork

答案 2 :(得分:1)

初期问题

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

即时问题

首先由他人识别 - 他们得到了信用。

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