以下 fork() 调用的输出是什么?
func(){
fork();
fork();
fork() && fork() || fork();
fork();
print("Saikacollection\n");
}
任何人都可以帮助我获得此代码的答案以及一些解释,因为我是 OS 新手?我在 SO 上发现了几个关于 fork() 的问题,但想不通。
以下 fork() 调用的输出是什么?
func(){
fork();
fork();
fork() && fork() || fork();
fork();
print("Saikacollection\n");
}
任何人都可以帮助我获得此代码的答案以及一些解释,因为我是 OS 新手?我在 SO 上发现了几个关于 fork() 的问题,但想不通。
Saikacollection 将打印40
时间作为代码的输出。这可以解释如下:-
要了解输出,我们需要了解以下内容:-
parent process.
pid
子进程的(进程标识符)返回给父进程0
子进程。考虑显示的图像:-
约定:该过程的所有父母(调用者)都被写入left
并标有star
.
fork()
一开始,我们只有 1 个进程,因此 fork() 调用会创建一个子进程。将树的根视为第 1 级,我们可以看到在第 2 级,我们有两个进程,父进程(左)和子进程(右)。
fork()
fork() 再次进一步创建4
这样的进程,标记为 1、2、3、4。由于所有四个进程都将进一步经历相似的代码结构,我们可以说进程总数将是4
单个进程产生的次数
fork()&&fork()||fork()
理解这个陈述涉及,意识到在 C 中,&& operator has more precedence than ||
first
由&&
go连接的两个操作数wrong
,我们don't check the second
。同样,如果first
是的两个操作数||
,true
操作we don't check the second
数。&&fork()
返回一个进程的 pid,该进程终止,而该步骤的子级得到 0。因此,它执行||fork()
||fork()
调用,结果进一步产生了一个过程如果我们对所有三个节点都做同样的事情,我们就可以得到5*4 = 20
进程。
fork()
最后的 fork() 只是doubles
该步骤可用的进程数。
2*20 = 40
.Saikacollection 每次在新行中打印 32 次。
如果您希望新进程更加独立,您可以查看 exec-* 系列函数(POSIX) - 这样您就可以分叉,然后立即替换分叉进程(您可以这样做,因为新分叉的进程受到控制由你); 或者也可以看看 popen() 。