#include <unistd.h>
#include <stdio.h>
int child;
pid_t pid;
int main(void)
{
int i ;
for(i=0;i<3;i++)
{
pid = fork();
child = getpid();
if( pid == 0) // child
printf("Child process %d\n", child);
}
return 0;
}
这是我的代码。每次执行for循环时都会使用fork创建子进程和父进程。我不知道创建了什么进程(子进程或父进程)但我问什么是子进程和打印它的id号。执行代码后,它显示为
Child process:2001
Child process:2002
Child process:2003
Child process:2004
Child process:2005
Child process:2006
答案 0 :(得分:3)
一张图片胜过千言万语:
答案 1 :(得分:2)
毫无疑问for循环迭代超过3次,但这就是发生的事情
fork1
/ \
fork2 fork3
/ \ / \
fork4 fork5 fork6 fork7
因此,您将获得7个值
我屏幕上的输出
Child process 4910
Child process 4911
Child process 4912
Child process 4913
Child process 4915
Child process 4914
Child process 4916
您将获得2 ^ n-1个处理器
在你的情况下2 ^ 3-1 = 8 - 1 = 7。
答案 2 :(得分:0)
在fork
之后,孩子和父母都会活着,两个人都会执行下一个循环,然后两个人都会分叉......等等。
不清楚你想做什么,但是你可以通过在打印后退出孩子来获得所需的输出。
检查一个类似的问题:Confused with output of fork system call
答案 3 :(得分:0)
将有7次调用fork()。此后总共会有2 ^ 3 = 8个进程。像这样:(数字是流程ID)
// P - parent after fork
// c - child after fork 18099
// P,18099 c18101
// P,18099 c18102 P18101 c18103
//P,18099 c18104 P18102 c18110 P18101 c18105 P18103 c18112
我过去使用此代码对此进行了测试:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
static int *glob_var;
int main(int argc, char** argv) {
glob_var = mmap(NULL, sizeof *glob_var, PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_ANONYMOUS, -1, 0);
*glob_var = 0;
/* fork is called 15 times
* will create 16 processes
* parent, 18099 forks 4 times,
* it's 1st child 18101 forks 3 times
* it's 2nd child 18102 forks 2 times(1st child of 18102, the 18110 forks 1 time)
* it's 3rd child 18104 forks 1 time
* 1st child of 18101, the 18103 forks 2 times
* 2nd child of 18101, the 18105 forks 1 time
* 1st child of 18103, the 18112 forks 1 time
*/
int pid; int i = 0;
for( i = 0; i < 4; ++i)
pid = fork();
sleep(1); printf("fork, pid:%d\n", pid);
(*glob_var)++;
fflush( stdout); sleep(1);
/* I am child, print */
if( pid==0) printf( "glob_var:%d\n", *glob_var);
fflush( stdout); sleep(10);
munmap(glob_var, sizeof *glob_var);
return (EXIT_SUCCESS);
}