问叉()多个进程Unix

use*_*514 15 c fork process

所以我有这个功能,分叉N个子进程.然而,似乎分叉超过指定.你能告诉我我做错了什么吗?谢谢

void forkChildren(int nChildren){
    int i;
    for(i = 1; i <= nChildren; i++){
        pid = fork();
        if(pid == 0)          
            printf("I'm a child: %d PID: %d\n",i, getpid());
    }

} 
Run Code Online (Sandbox Code Playgroud)

在主要我打电话:

forkChildren(5);
Run Code Online (Sandbox Code Playgroud)

我期待以下输出:

I'm a child: 1 PID: 2990
I'm a child: 2 PID: 2991
I'm a child: 3 PID: 2992
I'm a child: 4 PID: 2993
I'm a child: 5 PID: 2994
Run Code Online (Sandbox Code Playgroud)

但相反,我得到以下内容:

I'm a child: 1 PID: 2990
I'm a child: 2 PID: 2991
I'm a child: 3 PID: 2992
I'm a child: 4 PID: 2993
I'm a child: 5 PID: 2994
user@computer:~/directory/$ I'm a child: 2 PID: 2999
I'm a child: 3 PID: 3000
I'm a child: 3 PID: 3001
I'm a child: 4 PID: 3002
I'm a child: 5 PID: 3003
I'm a child: 5 PID: 3004
I'm a child: 4 PID: 3005
I'm a child: 5 PID: 3006
I'm a child: 4 PID: 3007
I'm a child: 5 PID: 3008
I'm a child: 3 PID: 3011
I'm a child: 4 PID: 3012
I'm a child: 4 PID: 3010
I'm a child: 5 PID: 3013
I'm a child: 5 PID: 3014
I'm a child: 5 PID: 3015
I'm a child: 4 PID: 3018
I'm a child: 5 PID: 3019
I'm a child: 5 PID: 3020
I'm a child: 5 PID: 3021
I'm a child: 5 PID: 3023
I'm a child: 5 PID: 3025
I'm a child: 5 PID: 3024
I'm a child: 4 PID: 3022
I'm a child: 5 PID: 3026
I'm a child: 5 PID: 3027
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 15

当你进行fork一个过程时,你基本上会得到两个(几乎)精确的过程副本,并且它们都会继续运行.

所以正在发生的事情是,孩子们自己在自己的进程空间中继续循环(在他们打印输出之后)以及父进程.而且,事实上,因为这些孩子也在分叉,孙子孙女也将继续从那时起.我确定有一个公式可以确定你最终得到了多少孩子(可能是N!)但我现在没有精力解决这个问题.最好使用以下解决方案.

告诉父母和孩子之间区别的方法是来自的回报值fork.

  • 如果你回到-1,你就是父母和fork失败者.
  • 如果你回到零,你就是孩子.
  • 如果你得到一个正数,你就是父,那个数字就是子PID(所以你可以操纵它或者wait它).

这是一些测试代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void forkChildren (int nChildren) {
    int i;
    pid_t pid;
    for (i = 1; i <= nChildren; i++) {
        pid = fork();
        if (pid == -1) {
            /* error handling here, if needed */
            return;
        }
        if (pid == 0) {
            printf("I am a child: %d PID: %d\n",i, getpid());
            sleep (5);
            return;
        }
    }
}

int main (int argc, char *argv[]) {
    if (argc < 2) {
        forkChildren (2);
    } else {
        forkChildren (atoi (argv[1]));
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和一些输出,以显示正在发生的事情:

pax> forktest 5
I am a child: 1 PID: 4188
I am a child: 2 PID: 4180
I am a child: 3 PID: 5396
I am a child: 4 PID: 4316
I am a child: 5 PID: 4260

pax> _
Run Code Online (Sandbox Code Playgroud)


Ste*_*ker 14

fork()调用产生一个新进程,它 fork发生的完全相同的点开始执行.所以,看起来像fork"返回两次"

这里发生的事情是你的fork()调用返回两次,所以父进程和子进程都继续循环并产生新的进程.每个孩子(原来的父母和孩子)然后再次分叉,反复加倍进程的数量......