使用fork()获取孩子的孩子

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用fork()获取孩子的孩子相关的知识,希望对你有一定的参考价值。

我在操作系统课上遇到了一些麻烦。我需要在C中编写一个函数,其中每个子节点生成另一个子节点,并且每个父节点只能有一个子节点。我还要打印他们的pid。

这是我到目前为止:

#define MAX_COUNT 10

pid_t ex5_1 (pid_t pid) {
    pid = fork();
    if (!pid) {
        printf("ID %d Parent %d 
", getpid(), getppid());
        _exit(1);   
    }
    return pid;
}
void ex5 () {
     pid_t  pid;
     int    i;
     pid = fork();
     for (i = 1; i <= MAX_COUNT; i++) {
          pid = ex5_1(pid);
          int status;
          wait(&status);
     } 
}

如果有人能提供帮助,我将非常感激!

答案

这是男人对叉子说的话:

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

所以你只需要像这样检查fork的返回:

int pid = fork();
if (pid < 0)
    // error handling here
else if (pid == 0)
    // here you are in the child
else
    // here you are in the parent

最后,要在孩子中创建一个孩子,你可以这样做:

void child(int i)
{
    int pid;

    printf("Child number %d, ID %d Parent %d 
", i,  getpid(), getppid());
    if (i == MAX)
        return;
    pid = fork();
    if (pid < 0)
        // error handling here
    else if (pid == 0)
        child(++i);
    else
        waitpid(pid, null, 0);
    exit(0);
}

int main() {
    int i = 0;  
    int pid = fork();
    if (pid < 0)
        // error handling here
    else if (pid == 0)
        child(++i);
    else
        waitpid(pid, null, 0);
}

以上是关于使用fork()获取孩子的孩子的主要内容,如果未能解决你的问题,请参考以下文章

如何防止孩子在 fork() 之后干扰父母的标准输入

“ScrollView 只能承载 1 个孩子”在 2 个片段中只有 1 个孩子?

fork + exec + caller 不应该等待孩子

命名管道,使用 Fork()

使用 BeautifulSoup 获取标签的孩子数

pcntl_fork()函数