C++ 检测fork()中的子进程创建

C++ 检测fork()中的子进程创建,c++,unix,fork,C++,Unix,Fork,fork()系统调用生成地址空间的两个相同副本,一个用于父级,另一个用于子级 将fork与if语句一起使用时,在以下代码中会创建多少次子进程 fork(); pid=fork(); if(pid==0) { fork(); } 添加一点额外的代码以获得如下内容: #include <stdio.h> #include <unistd.h> int main() { pid_t pid; pid = fork(); if (pid != 0) p

fork()
系统调用生成地址空间的两个相同副本,一个用于父级,另一个用于子级

将fork与if语句一起使用时,在以下代码中会创建多少次子进程

fork();
pid=fork();
if(pid==0)
{
fork();
}

添加一点额外的代码以获得如下内容:

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    pid = fork();
    if (pid != 0) printf("%d\n", pid);
    pid = fork();
    if (pid != 0) printf("%d\n", pid);
    if(pid==0)
    {
        pid = fork();
        if (pid != 0) printf("%d\n", pid);
    }
    return 0;
}
#包括
#包括
int main()
{
pid_t pid;
pid=fork();
如果(pid!=0)printf(“%d\n”,pid);
pid=fork();
如果(pid!=0)printf(“%d\n”,pid);
如果(pid==0)
{
pid=fork();
如果(pid!=0)printf(“%d\n”,pid);
}
返回0;
}

然后编译、执行并检查其输出:5个子进程ID

添加一点额外的代码以获得如下结果:

#include <stdio.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    pid = fork();
    if (pid != 0) printf("%d\n", pid);
    pid = fork();
    if (pid != 0) printf("%d\n", pid);
    if(pid==0)
    {
        pid = fork();
        if (pid != 0) printf("%d\n", pid);
    }
    return 0;
}
#包括
#包括
int main()
{
pid_t pid;
pid=fork();
如果(pid!=0)printf(“%d\n”,pid);
pid=fork();
如果(pid!=0)printf(“%d\n”,pid);
如果(pid==0)
{
pid=fork();
如果(pid!=0)printf(“%d\n”,pid);
}
返回0;
}

然后编译、执行并检查其输出:5个子进程ID

五次。你需要进一步解释吗?“制作两个地址空间的相同副本”-不,不需要。它为已经存在的地址空间创建一个相同的副本。在大多数现代实现中,它甚至没有这样做——它只是创建了一个新的地址空间,它引用了与原始页面相同的所有页面,但将它们标记为“写上拷贝”。五次。你需要进一步解释吗?“制作两个地址空间的相同副本”-不,不需要。它为已经存在的地址空间创建一个相同的副本。在大多数现代的实现中,它甚至没有这样做——它只是创建了一个新的地址空间,它引用了与原始页面相同的所有页面,但将它们标记为写时复制。