首页 > 试题广场 >

下面代码不算 main 这个进程,一共创建了多少个进程()

[单选题]
下面代码不算 main 这个进程,一共创建了多少个进程()
int main(int argc, char* argv[])
{
   fork();
   fork() && fork() || fork();
   fork();
}
  • 18
  • 19
  • 20
  • 21
编辑于 2017-03-28 23:13:29 回复(0)
要减去main进程自身。。。没注意呀
发表于 2016-11-26 10:56:03 回复(0)
考查两个点
1、A&&B||C
A为假,跳过B,判断C
A为真,判断B,若B为真,跳过C
                          若B为假,判断C
2、fork()函数父进程返回子进程ID;子进程返回0

第一条语句新增1个
第二条语句新增4*2个
第三条语句,此时已有进程1+1+4*2个,所以新增10个
发表于 2015-07-21 22:37:15 回复(10)
发表于 2016-03-05 16:52:43 回复(14)
B
fork()是一个分叉函数, 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程   返回子进程标记;否则,出错返回-1
每一次fork()就翻倍;
   fork();
   fork() && fork() || fork();
   fork();
第一条和第三条分别X2;关键在第二条语句。第二条有 5个分支;
A&&B||C
   A为假,跳过B,判断C-----------------------2
   A为真,判断B,若B为真,跳过C-----------1
                          若B为假,判断C  ------------2

故总数为2*(2+1+2)*2=10;减去自己就是19.

编辑于 2021-12-22 09:47:31 回复(19)
只看这句, fork() && fork() || fork(); 结果有5个进程

第一句 ,fork 后进程加倍,所以执行 fork() && fork() || fork() 后有10个进程

最后一句进程加倍,就是20个

减去主进程,结果共有 19个
发表于 2015-04-28 19:14:56 回复(8)
首先,这道题目的考察点1.fork调用一次,返回两次,子进程一次返回0,父进程一次返回pid_t  2. A && B || C 中逻辑与和逻辑或. A && B || C ,当A为假(用0表示),直接短路B,即B不执行.然后把(A && B)堪称一个表达式,当这个表达式值为1, C不执行.   然后分析题目:
假设 int main()
{
    fork1();
    fork2() && fork3() || fork4();
    fork5();
}
图片传不上去,改天再写
发表于 2015-04-03 23:25:30 回复(2)
此题考查两个知识点:
1.fork()是一个分叉函数,返回值: 若成功调用一次则返回两个值,子进程返回0, 父进程 返回子进程标记;否则,出错返回-1。
2.  A&& B|| C的考查,  A&&B,如果A=0,就没有必要继续执行&&B了;A非0,就需要继续执行&&B。  
    A||B,如果A非0,就没有必要继续执行||B了,A=0,就需要继续执行||B。  
所以,第一次fork()之后,进程数为2,
第二条,
A&& B|| C
A执行后,返回两个分别为0,和非0,按照上面2的规则,执行情况一共是5条路径,所以结束后共有进程数2*5,最后一条执行完毕,再次加倍,2*5*2=20,减去main()主进程,共有19个
发表于 2015-08-13 20:31:41 回复(10)
蒙题大法,这道题的答案+1肯定能被4整除,所以会节省会多时间算
发表于 2015-08-20 21:16:30 回复(6)
如果你能看懂上面的解释呢,就不用看我这个了,我这个是菜鸟版的,因为我自己也是菜鸟:

    如果对以上的 fork() 调用依次编号成 1,2,3,4,5 的话,那么在调用 1 时,正常情况下,会创建一个新进程 A ,并将新进程 A id 返回给原进程。原进程将继续调用剩下的 fork()

       虽然新进程 A 的代码跟原进程一样,但新进程中调用 1 会返回 0 ,返回 0 则表示没有再创建新的进程。新进程 A 将继续调用 2 ,正常情况下将创建一个新进程 B ,并将新进程 B id 返回给 A 。然后进程 A 将继续调用剩下的 fork() 函数。

       新进程 B 中调用 1 2 都将返回 0 ,表示没有创建新进程,然后由于 && 具有短路性质,所以 B 将直接调用 4 ,正常情况下将会创建一个新进程 C ,并将进程 C id 返回给 B 。然后进程 B 将继续调用剩下的 fork() 函数。

       程序将按照这样的调用过程,可以画一个图来展示调用的过程:

编辑于 2015-08-17 16:34:17 回复(2)
主要在中间3个fork上,可以画一个图进行描述。
    这里就需要注意&&和||运算符。
    A&&B,如果A=0,就没有必要继续执行&&B了;A非0,就需要继续执行&&B。
    A||B,如果A非0,就没有必要继续执行||B了,A=0,就需要继续执行||B。
    fork()对于父进程和子进程的返回值是不同的,按照上面的A&&B和A||B的分支进行画图,可以得出5个分支。
加上前面的fork和最后的fork,总共4*5=20个进程,除去main主进程,就是19个进程了。
发表于 2015-07-20 16:09:55 回复(2)
其实很简单,第一个fork();使得进程数扩大了两倍,最后一个fork()再次扩大了进程数。减去主进程。那么一定是4的倍数减1.
发表于 2015-09-16 20:12:00 回复(0)
只看fork() && fork() || fork(),一个fork生成返回值为0的子进程和返回值大于0父进程副本
如图生成5个进程
最终2*5*2-1=19
发表于 2015-12-07 21:40:29 回复(0)
只在这里解释一下 A&&B||C 的5种情况:
1,A=0, B不看,C=0
2,A=0, B不看,C=1
3,A=1, B=0,C=0
4,A=1, B=0,C=1
5,A=1, B=1,C不看
编辑于 2015-08-20 23:26:06 回复(0)
选B 第一行的fork()新生成一个进程
    第二行的fork()新生成四个进程,共新增进程2*4=8,
    第三行的fork(),基于已有进程又新增进程,有进程1+8+10=19
发表于 2015-03-30 12:34:02 回复(0)
备注下解题思路。 B fork()是一个分叉函数, 返回值: 若成功调用一次则返回两个值,子进程返回0,父进程   返回子进程标记;否则,出错返回-1 每一次fork()就翻倍;    fork();    fork() && fork() || fork();    fork(); 第一条和第三条分别X2;关键在第二条语句。第二条有 5个分支; A&&B||C    A为假,跳过B,判断C-----------------------2    A为真,判断B,若B为真,跳过C-----------1                           若B为假,判断C  ------------2 故总数为2*(2+1+2)*2=10;减去自己就是19.
发表于 2019-03-08 13:22:28 回复(0)
fork()是一个分叉函数,   返回值: 若成功调用一次则返回两个值,子进程返回0,父进程       返回子进程标记;否则,出错返回-1
第一条语句的fork()和第三条语句的fork()之后进程数都翻倍,这个应该都知道。
最重要的是中间的语句会产生5个进程,如下图所示,将三个fork()函数分别写成fork(1)&&fork(2) || fork(3)。考查逻辑表达式。
A&&B,当A为假时,则不用判断B真假
A||B,当A为真时,则不用判断B真假。
发表于 2017-07-18 15:23:30 回复(1)
由fork创建的新进程被称为子进程(child process),该函数被调用一次,但返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新进程(子进程)的进程 id。
发表于 2020-03-23 11:16:42 回复(0)
中间的 fork() && fork() || fork()产生5个进程,所以一共有2*5*2 = 20个进程,不算main就是19个
发表于 2017-06-07 11:06:54 回复(0)
图文并茂:http://notes.maxwi.com/2016/08/17/linux-fork/
发表于 2016-08-17 19:57:47 回复(0)