我正在通过分叉创建新流程:
printf("original process = %d\n", getpid());
fork();
printf("parent = %d; child = %d\n", getpid(), getppid());
fork();
printf("parent = %d; child = %d\n", getpid(), getppid());
if(fork() == 0){
printf("parent = %d; child = %d\n", getpid(), getppid());
if(fork() == 0){
printf("parent = %d; child = %d\n", getpid(), getppid());
}
}
fork();
printf("parent = %d; child = %d\n", getpid(), getppid());
我想打印出我创建的进程数。我上面看到的方法并不是打印创建了多少进程的最佳方法。所以我的问题是:我们如何打印每次分叉时创建了多少新进程而没有某种循环?
答案 0 :(得分:1)
每次成功调用fork都会创建一个新进程,父进程和子进程都从fork()
返回。孩子将得到0作为回报,父母得到孩子的PID。
printf("I am the root %d\n", getpid());
if (fork() == 0)
printf("I am %d, child of %d\n", getpid(), getppid());
if (fork() == 0)
{
printf("I am %d, child of %d\n", getpid(), getppid());
if (fork() == 0)
printf("I am %d, child of %d\n", getpid(), getppid());
}
if (fork() == 0)
printf("I am %d, child of %d\n", getpid(), getppid());
等等......
您的代码中的问题是您在某些情况下打印文本而未检查fork()
的返回值,因此这些行将由父级和子级打印。使用我的代码,每个进程在创建时只打印一行。
答案 1 :(得分:0)
当每个人创建/生成子进程时,
基于fork()的调用顺序
共创建了24个子进程,这就是它的完成方式
1st fork(); ( 4 更多fork()调用)
第2个分叉(); ( 3 更多fork()调用)
3st fork(); ( 2 更多fork()调用)
第4个分叉(); ( 1 更多fork()调用)
因此,子进程的总数将 4! - 1 ,即 4x3x2x1 = 24 - 1
创建了23个子进程