【问题标题】:How to implement a system call fork ()?如何实现系统调用fork()?
【发布时间】:2025-11-21 16:55:02
【问题描述】:

众所周知,Linux 中的每个进程都会调用 fork()。它将正常返回 0 或 1 或 -1 表示错误。但是,我不知道如何制作一个可以同时具有两个值的变量。你能给我一些帮助来帮助我实现它吗?

【问题讨论】:

  • 为什么你认为你需要一个存储两个值的变量?
  • 看起来标题应该是“如何使用fork() 在子进程和父进程中具有不同的值”,而不是“如何实现fork()”...

标签: fork system-calls


【解决方案1】:

没有一个变量有两个值。有两个变量,一个在父项中,一个在子项中,每个变量只有一个值。 fork 调用返回两次。该过程的行为就像它被复制一样。

如果您有兴趣了解fork 的实现方式,我建议您从查看实际实现开始。考虑:

bool is_child()
{
    pid_t pid = getpid();
    // some system call that returns twice (like 'clone')
    return (getpid() == pid);
}

这里有一个函数,它的返回值取决于它从哪个进程返回。如果您执行j = is_child();,则变量j 将是父级中的false 和子级中的true

这是一个完整的工作示例:

    #include <sys/types.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <stdlib.h>

    bool my_fork()
    {
        pid_t pid = getpid();
        fork(); // we ignore the return value
        return pid == getpid();
    }

    int main(void)
    {
        bool j = my_fork();
        if (j)
            printf("parent\n");
        else
            printf("child\n");
        _exit (0);
    }

【讨论】: