一尘不染

2个或更多fork系统调用如何工作?

linux

这是我使用2 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;
}

我得到的输出为:
0。我是进程27701
1. 我是进程25915 1.我是
进程27701
2.我是进程27781
2.我是进程26170
2.我是进程27701

这是我使用3个fork系统调用的下一个程序,如何获得这样的输出? 如果我要手动解决此代码,那么逻辑是什么?

#include <unistd.h>
#include <iostream>
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;
    (void) fork();
    cout << "3. I am process " << getpid() << endl;
}

在这里,我得到的输出为:
0。我是进程27116
1.我是进程26147
2.我是进程27371
2.我是进程26147
3.我是进程24416
3.我是进程27371
3.我是进程27508
3 。我是进程26147
1.我是进程27116
2.我是进程21406
2.我是进程27116
3.我是进程27369
3.我是进程21406
3.我是进程26752
3.我是进程27116


阅读 231

收藏
2020-06-03

共1个答案

一尘不染

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

阅读Advanced
Linux编程
书和fork(2)手册页(请仔细阅读该页面几次)。

典型代码应为:

  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
  }

并且同样for pid_t pid2=fork();和then for pid_t pid3=fork();等等。因此,每个对的调用fork都应处理3种结果的情况fork(失败,即<0子进程==0,父进程>0

原则上您有3 3即27种可能性。但是您可以尽早处理失败案例,剩下2 3即8。

不要忘记处理的失败fork。你可能会降低你的进程限制(使用了setrlimit(2)使用RLIMIT_NPROC或等值的ulimit
bash的内置),以缓解测试fork失败。

2020-06-03