c - 问题 fork() 多进程 Unix

标签 c process fork

所以我有这个函数可以 fork 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());
    }

} 

在主要我调用:

forkChildren(5);

我期待以下输出:

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

但我得到的是:

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

最佳答案

fork() 调用生成一个新进程,该进程在派生发生的同一点开始执行。所以,看起来 fork “返回了两次”

这里发生的是您的 fork() 调用返回两次,因此父进程和子进程都继续循环并产生新进程。每个 child (原始 parent 和 child 的)然后再次 fork ,重复加倍进程数......

关于c - 问题 fork() 多进程 Unix,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1664787/

相关文章:

c - mvaddch() 不打印到控制台

C Pthreads - 父/子

C 通过 stdin 读取文件读取随机符号

c - 带有 pthread 的简单 Linux C/S 套接字

python - 具有 C 扩展模块的 Python 项目的目录布局

java - 如何知道gradle进程已经结束?

c - 程序卡在管道上(exec ls grep sort)

c - 调试散列结果 : Lengths, 数组、字符

c - 当在死 pid 上调用 ptrace(PTRACE_DETATCH,pid,NULL,NULL) 时会发生什么?

Python 循环延迟