c-在fork之后保持父进程在前台



我有一个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 Forkn");
        sleep(1);
    }
    printf("forking...n");
    pid_t pid = fork();
    if (pid) {
        // child
        printf("Child started and now exitingn");
        exit(EXIT_SUCCESS);
    }
    // parent
    wait(NULL);
    for (i = 0; i < 3; i++) {
        printf("After Forkn");
        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$

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

if (!pid)

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

成功时在父进程中返回子进程的PID,并且在子级中返回0。失败时,在中返回-1如果是父进程,则不创建子进程,并且正确设置了errno。

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

当条件为零时,若循环将不执行。

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

if(!pid)

更多详细信息人叉

初始问题

你需要绕着wait()转一圈。正如所写的,它等待一个子进程完成(忽略返回的PID,不设置状态)。shell的wait命令与系统调用不同,但代码看起来就像是通过与shell的命令进行类比而编写的。

直接问题

首先由他人识别--请他们获得信用

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

最新更新