c++ linux fork

判断父子进程的参考博客:https://blog.csdn.net/cckluv/article/details/109169941

等待子进程的参考博客:https://blog.csdn.net/Mmmmmmmrr/article/details/97825932

在父进程中,fork返回新创建子进程的进程ID; 在子进程中,fork返回0; 如果出现错误,fork返回一个负值;

fork 是基于写时拷贝的,所以,fork得到的两个进程,一开始状态是一模一样的。

1 判断父子进程的例子:

int main()
{
    pid_t fpid; //fpid表示fork函数返回的值
    int count = 0;
    fpid = fork();
    if (fpid < 0)
        printf("error in fork!");
    else if (fpid == 0) {
        printf("i am the child process, my process id is %d/n", getpid());
        printf("我是爹的儿子/n");//对某些人来说中文看着更直白。
        count++;
    }
    else {
        printf("i am the parent process, my process id is %d/n", getpid());
        printf("我是孩子他爹/n");
        count++;
    }
    printf("统计结果是: %d/n", count);
    return 0;
}

2 等待子进程的例子

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <error.h>
 int main()
 {
     pid_t id = fork();
      if(id < 0)
       {
          perror("fork");
          exit(1);
       }
      if(id == 0)
      {
          printf("I am child...\n");
          sleep(20);
          exit(10);
      }
      else
      {
          int st;
          int ret = wait(&st);
          if(ret > 0 && (st & 0x7F) == 0)
          {
               //正常终止
              printf("child exit code:%d\n",(st >> 8)&0x7F);
          }
          else if(ret > 0)
          {
              //异常退出
              printf("sig code:%d\n",st&0x7F);
          }
      }
  }

3 在for循环中使用时要小心,错误的例子展示

for(int i=0;i!=cmds.size();++i) {
    pid_t fpid; //fpid表示fork函数返回的值
    fpid = fork();
    if(fpid==0) {
        TV st = getTime();
        system(cmds[i].c_str());
        TV et = getTime();
        string costTimeStr = getCTS(st, et);
        saveCmdTime(costTimeStr);
    } else {
        int st;
        int ret = wait(&st);
    }
}

作者的本意(没错就是我,2333)是父进程去分派任务,子进程干活。

但程序实际的意思是,父进程分派任务,子进程干完当前cmds[i]的任务后,开始分派i往后的任务。

所以第0个任务执行一次,第1个任务会执行2次,第三个任务会执行3次,等等。

我当时任务个数是17,所以就是17+16+15+14+13+12+11+...+1=((17+1)*8)+9=144+9=153

然后这153个进程就把服务器给干的动不了了。

要我说啊这个服务器就是菜(233333)。

3 for循环正确写法

for(int i=0;i!=cmds.size();++i) {
pid_t fpid; //fpid表示fork函数返回的值
    fpid = fork();
    if(fpid==0) {
        TV st = getTime();
        system(cmds[i].c_str());
        TV et = getTime();
        string costTimeStr = getCTS(st, et);
        saveCmdTime(costTimeStr);
        break;
    } else {
        int st;
        int ret = wait(&st);
    }
}
文章目录