ccb1900 / blog

blog
https://blog.itiswho.com
MIT License
1 stars 0 forks source link

OSTEP 阅读笔记 #60

Open ccb1900 opened 5 years ago

ccb1900 commented 5 years ago
ccb1900 commented 5 years ago

创建多个兄弟进程

fork 函数执行之后,父子进程分别继续执行后面的代码。

#include <stdio.h>
#include <unistd.h>
// 创建多个兄弟进程
int createPool(int num);
int main() {
  printf("x\n");
  int ppid = createPool(2);

  if (ppid > 0) {
    //  每个子进程执行一次,得到子进程的id
    printf("worker child %d pid %d \n",ppid,getpid());
  } else if(ppid == 0) {
    // 执行一次, 得到的是父进程id
    printf("master parent %d pid %d \n",ppid,getpid());
  }
  // 父子进程都会执行,得到多个进程id。所以这里的代码会执行很多次
  // 本质是个时序问题
  //  所以如果在此处进fork
  printf("y,pid= %d pool = %d\n",getpid(),ppid);
}

int createPool(int num) {
  if(num == 0) {
    // 执行一次, 得到的是父进程id
    printf("master over success=%d\n",getpid());
    return 0;
  }
  int pid = fork();
  if (pid == 0) {
    //  每个子进程执行一次,得到子进程的id
    printf("child success=%d\n",getpid());
    return num;
  } else if (pid > 0) {
    //  每个子进程创建前后 父进程的行为
    printf("worker pre=%d\n",getpid());
    // 创建子进程
    int n = createPool(num-1);
    printf("worker after=%d\n",getpid());
    return n;
  } else {
    printf("error\n");
    return -1;
  }
}