下面的C代码将生成多少进程和线程?

下面的C代码将生成多少进程和线程?,c,multithreading,process,C,Multithreading,Process,考虑以下用C语言编写的代码。执行while(1)时我们将分别拥有多少个进程和线程 int main(void) { int i; for (i=0; i<3; i++) fork(); while(1); } int main(无效) { int i; 对于(i=0;i 一个进程总是有一个主线程,否则它将无法将自己调度到允许物理处理器执行指令的线程队列中 此外,您可以生成的进程/线程数量没有实际限制,因为它受到系统内存的限制 假设fork没有失败,下面的代

考虑以下用C语言编写的代码。执行
while(1)时我们将分别拥有多少个进程和线程

int main(void) 
{
   int i;
   for (i=0; i<3; i++)
      fork();
   while(1);
}
int main(无效)
{
int i;
对于(i=0;i
一个进程总是有一个主线程,否则它将无法将自己调度到允许物理处理器执行指令的线程队列中

此外,您可以生成的进程/线程数量没有实际限制,因为它受到系统内存的限制

假设fork没有失败,下面的代码(不包括父进程)将生成3个进程,每个进程生成1个线程

这意味着,包括父进程、4个进程和4个线程。


参见David Schwartz的答案

一个简单的方法是在
while(1)
循环之前添加这一行:

printf("I am process: %d, my parent is %d\n", (int) getpid(), (int) getppid());
示例输出:

我是4365,我的父母是8358
我是4366,我的父母是4365
我是4367,我的父母是4365
我是4369,我的父母是4365
我是4368,我的父母是4366
我是4370,我的父母是4366
我是4371,我的父母是4367
我是4372,我的父母是4368

总共有8个进程,每个进程都有一个线程

发生了什么事?8358是我的外壳。当我执行这段代码时,它创建了进程4365。就是这样

4365创建了三个进程,一个是当它还有两个循环要执行时(4366),一个是当它还有一个循环要执行时(4367),还有一个是在它的最后一个循环上(4369)。这是三个,所以现在我们最多有四个

它创建了两个循环(4366)创建了另外两个进程,一个是当它有一个循环(4368)时,另一个是当它没有循环(4370)时。这是另外两个,所以现在我们最多有六个


我们仍然有两个流程有一个循环,一个由第一个流程创建(4367),另一个由第二个流程创建(4368)。每个流程都会创建一个以上的流程(4371和4372)。还有两个,所以现在我们最多有8个。

您没有创建任何额外的线程,只创建额外的进程。因此,如果我们同意每个进程有一个线程运行
main
,那么线程的数量等于进程的数量。至于有多少个进程,最简单的方法是输入
printf
while(1)
前面,请参见。您可能希望打印进程ID和父进程ID(分别来自
getpid
getppid
)因为这将允许您重新创建整个进程树。感谢@user3386109,fork创建了8个额外的进程。我不确定线程的数量。说每个进程有一个线程是正确的吗?是的,据我所知,每个进程有一个线程。听起来像是一个家庭作业问题。您的回答没有考虑到活动生成的进程的数量。