给定的C fork代码将创建多少个线程

给定的C fork代码将创建多少个线程,c,fork,C,Fork,考虑下面给出的代码: #include <stdio.h> #include <unistd.h> int main() { fork(); fork() && fork() || fork(); fork(); printf("forked\n"); return 0; } #包括 #包括 int main() { fork(); fork()&&fork()| fork(); fork(); print

考虑下面给出的代码:

#include <stdio.h> 
#include <unistd.h> 
int main() 
{ 
   fork(); 
   fork() && fork() || fork(); 
   fork();
   printf("forked\n"); 
   return 0; 
}
#包括
#包括
int main()
{ 
fork();
fork()&&fork()| fork();
fork();
printf(“分叉的”);
返回0;
}
问题是要打印多少次
forked
。根据我的分析,应该打印20次。答案也证实了这一点


但是,当我在和上运行代码时,它们分别打印了18次和5次。为什么会这样?

您的代码不创建任何线程。这些线程在Linux上被调用,您将使用(内部使用)来创建它们

当然,您的代码正在(错误地)使用,因此它创建了(除非
fork
失败)。请注意,
fork
很难理解(也很难解释,所以我甚至不在这里尝试)。你可能需要阅读很多关于它的内容,例如wikipage,也许(两者都有几个章节来解释)

您应该处理
fork
的故障。如所解释的,对于每个<代码>叉<代码>,有三种情况要考虑,并且最好改写代码,最多执行一个<代码>叉<代码>每个语句(一个赋值,如:代码> pIDyt pID= Fok();< /COD>)< /P> 顺便说一句,您最好在每个
fork
之前刷新标准流(及其缓冲区中的数据)。我建议通过调用
fflush(NULL)来使用在每个
分叉之前

请注意,每个进程都有自己的(唯一)pid(请参阅和)。如果打印它,您可能会更好地理解它,因此请尝试使用类似于
printf(“forked in%ld\n”,(long)getpid())的东西

当我运行代码时

您确实应该在Linux下的计算机上运行该代码。考虑在笔记本电脑或桌面上安装(也许在一些虚拟机上)。请注意,Linux对开发人员和学生都非常友好,它主要由您可以学习的源代码组成

他们分别打印了18次和5次。为什么会这样

免费web服务应该限制外部客户机使用的资源(在Linux上,他们可能会使用这些资源)。显然,这样的网站——能够运行几乎任意的C代码——想要避免。很可能,您的一些
fork
-s在它们上面失败了(而且由于您的原始代码没有检查失败,所以您没有注意到这一点)

即使在您自己的桌面上,也无法创建许多进程。根据经验,您的计算机上可能有数百个进程,其中大多数进程(等待,可能有阻塞或阻塞等,…等待某个IO或某个超时,另请参见),而只有十几个进程是可运行的(由您自己决定)。换句话说,一个进程是相当昂贵的计算资源。如果您有太多可运行的进程,您可以进行实验


使用和(以及
htop
and)查询Linux系统上的进程。如果您想以编程方式执行此操作,请使用
/proc/
(有关更多信息,请参阅)-
ps
top
pgrep
htop
等使用此功能。

好的,这对我来说是新的功能。如果是这样的话,我想知道fork
会被打印多少次。由于
fork
可能会失败,成功的次数通常是不可预测的。写
(fork()&&fork())
,然后再试一次,例如
/bin/nforks|wc-l
=
20
。(是的,您应该检查
fork
的返回是否失败)StackOverflow不是一个“做我的作业”站点这可能有点学术问题,但这并不意味着它是“做我的作业”问题。我已经阅读了相关问题的答案。我自己用不同的方法解决了这个问题,并尝试在线运行代码。因此,这并不是因为我不知道答案,而是我直接/盲目地复制了一些练习中粘贴的内容。正如你所看到的,同样的代码也被放在了相关的链接帖子(第一个链接)中,这篇帖子很受欢迎。为了更好地处理正在发生的事情,在打印中包括更多的信息——特别是当前PID和父PID。您可以将每个
fork()
的返回值捕获到一个包含5个整数的数组中,然后仔细安排打印该数组。小心可能意味着将其格式化为字符串,然后作为对
printf()
的单个调用的一部分打印该字符串;这将不同进程的交叉输出机会降到了最低,这将是一个相当大的问题,除非您安排它们随机休眠时间或其他什么。考虑在循环中使用<代码> WaIT()/<代码>。