所以我有这个功能,分叉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
.
fork
失败者.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()调用返回两次,所以父进程和子进程都继续循环并产生新的进程.每个孩子(原来的父母和孩子)然后再次分叉,反复加倍进程的数量......