Linux 两个或多个fork系统调用如何工作?

Linux 两个或多个fork系统调用如何工作?,linux,unix,system-calls,fork,Linux,Unix,System Calls,Fork,下面是一段代码,其中我使用了两个fork()系统调用,一个接一个- 它实际上是如何工作的 #include <unistd.h> #include <iostream.h> using namespace std; int main() { cout << "0. I am process " << getpid() << endl; (void) fork(); cout << "1.

下面是一段代码,其中我使用了两个fork()系统调用,一个接一个- 它实际上是如何工作的

 #include <unistd.h>
 #include <iostream.h>
 using namespace std;

 int main()
 {
    cout << "0. I am process " << getpid() << endl;
    (void) fork();
    cout << "1. I am process " << getpid() << endl;
    (void) fork();
    cout << "2. I am process " << getpid() << endl;
}
#包括
#包括
使用名称空间std;
int main()
{

cout只要画一棵树,其中每个根节点都是一个fork调用,叶节点是它后面的代码。


在第一个程序中,您只需绘制一棵树,其中每个根节点都是fork调用,叶节点是它后面的代码。


在第一个程序中,您的cout您的程序是完全错误的。您应该永远不要忽略
fork
的结果

阅读本书和手册页(仔细阅读该页数次)

典型代码应为:

  pid_t pid1 = fork();
  if (pid1<0) { perror("fork1 failed"); exit(EXIT_FAILURE); }
  else if (pid1 == 0) {
     // you are in the child process
  }
  else // pid1>0 
  {  // you are in the parent process
  }
pid_t pid1=fork();
如果(pid10
{//您处于父进程中
}
同样地,对于
pid\t pid2=fork();
pid\t pid3=fork();
等。。。。 因此,每次调用
fork
都应该处理
fork
的3种结果(失败,即
0

原则上你有33种,即27种可能性。但是你可以提前处理失败案例,剩下23种,即8种可能性


不要忘记处理
fork
的故障。您可以降低进程限制(使用
RLIMIT\u NPROC
或等效的bash内置)以简化
fork
故障的测试。

您的程序完全错误。您应该永远不要忽略
fork
的结果

阅读本书和手册页(仔细阅读该页数次)

典型代码应为:

  pid_t pid1 = fork();
  if (pid1<0) { perror("fork1 failed"); exit(EXIT_FAILURE); }
  else if (pid1 == 0) {
     // you are in the child process
  }
  else // pid1>0 
  {  // you are in the parent process
  }
pid_t pid1=fork();
如果(pid10
{//您处于父进程中
}
同样地,对于
pid\t pid2=fork();
pid\t pid3=fork();
等。。。。 因此,每次调用
fork
都应该处理
fork
的3种结果(失败,即
0

原则上你有33种,即27种可能性。但是你可以提前处理失败案例,剩下23种,即8种可能性

不要忘记处理
fork
的故障。您可以降低进程限制(使用
RLIMIT\u NPROC
或等效的bash内置)以简化
fork
故障的测试。

fork()
每次调用时的工作方式都是相同的。一个新进程被创建为当前进程的精确副本,并且两个进程都继续执行,就好像它们都是从
fork()
函数调用返回的一样,只是返回值不同。在您的例子中,您丢弃了该返回值,因此它们只是相同的进程

让我们为您的第一个示例绘制一幅图。我刚做的一次跑步的样本输出(因为您在问题中输入的输出不完整):

从PID 25597的单个进程开始。它打印
0
行,然后分叉。这将生成两个进程:

            25597          # prints "0"
             /\
            /  \
           /    \
         25597 25598       # both print "1"
到目前为止还不错。现在这两个新进程都再次调用
fork()
。完整的树最终如下所示:

                   25597
                    /\
                   /  \
                  /    \
                 /      \
                /        \
             25597      25598       # both print "1"
              /\          /\
             /  \        /  \
            /    \      /    \
         25597  25599 25598 25600   # all four print "2"
不幸的是,无法从输出中猜出25599和25600的实际位置——它们也可能是另一种情况

对于您的3-
fork()
示例,您只需做同样的事情,但它在图表中会有另一个级别-您将得到8个进程,每个进程打印“3”行。

fork()
每次调用时的工作方式都是相同的。一个新进程被创建为当前进程的精确副本,并且两个进程都继续执行,就好像它们都是从
fork()
函数调用返回的一样,只是返回值不同。在您的例子中,您丢弃了该返回值,因此它们只是相同的进程

让我们为您的第一个示例绘制一幅图。我刚做的一次跑步的样本输出(因为您在问题中输入的输出不完整):

从PID 25597的单个进程开始。它打印
0
行,然后分叉。这将生成两个进程:

            25597          # prints "0"
             /\
            /  \
           /    \
         25597 25598       # both print "1"
到目前为止还不错。现在这两个新进程都再次调用
fork()
。完整的树最终如下所示:

                   25597
                    /\
                   /  \
                  /    \
                 /      \
                /        \
             25597      25598       # both print "1"
              /\          /\
             /  \        /  \
            /    \      /    \
         25597  25599 25598 25600   # all four print "2"
不幸的是,无法从输出中猜出25599和25600的实际位置——它们也可能是另一种情况

对于您的3-
fork()
示例,您只需做同样的事情,但它在图中会有另一个级别-您将得到8个进程,每个进程打印“3”行。

调用fork()时,将创建并运行一个子进程。因此,您将在子进程中执行以下语句一次:

cout << "1. I am process " << getpid() << endl;
cout调用fork()时,将创建并运行一个子进程。因此,您将在子进程中执行以下语句一次:

cout << "1. I am process " << getpid() << endl;

这里有很多关于
fork
如何在这样复杂的情况下工作的问题。只要画一幅画。我需要画一幅画的逻辑!如果可能的话,请向第一个程序解释逻辑,如果我理解的话,我将自己尝试第二个程序。你的第一个程序应该输出4行标记为
2
,带有4个不同的PID。25915的输出发生了什么?这里有很多关于
fork
如何在这样复杂的情况下工作的问题。只需画一幅画。我需要画一幅画的逻辑!如果可能,请向第一个程序解释逻辑,如果我理解,那么我将尝试我自己的第二个程序。你的第一个程序应该输出4批标有
2
,带有4个不同PID的行。25915的输出怎么了?谢谢!你的解释太简单了,我一直在互联网上四处寻找一个简单的解释!谢谢!你的解释太简单了,我一直在胡思乱想我上网只是为了找到一个简单的解释!我写了这个测试代码来理解fork()在一个接一个地使用时是如何工作的