这是我使用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
您的程序完全错误。您 永远fork不应 忽略的结果 。
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)
pid_t pid2=fork();
pid_t pid3=fork();
<0
==0
>0
原则上您有3 3即27种可能性。但是您可以尽早处理失败案例,剩下2 3即8。
不要忘记处理的失败fork。你可能会降低你的进程限制(使用了setrlimit(2)使用RLIMIT_NPROC或等值的ulimit bash的内置),以缓解测试fork失败。
RLIMIT_NPROC