在理解 fork() 层次结构树时遇到问题
Having problem Understanding fork() hierarchy tree
我有这段我无法理解的代码。我了解 fork() 的基础知识,但我不了解此过程的层次结构树。
代码是这样的:
main()
{
fork();
if(fork()){
printf("A");
}
else{
printf("B");
}
}
输出是A A B B。这是怎么发生的?我明白为什么 A 被打印两次但为什么 B 被打印?分层树在这里如何工作?
输出是 A A B B -> 由于并发性,输出在运行之间可能会有所不同我有这个
所以逻辑如下:第一个 fork 在第一个 fork 之后再创建一个进程来执行相同的程序,这两个进程中的每一个都创建一个进程打印 B
然后打印 A
自己总共有 4 个进程
好的,让我们“画出”这个程序创建的进程树(使用 P
代表 parent 进程,C
代表 child 进程):
fork()
^
/ \
| |
P C
| |
/------------/ \------------\
| |
fork fork
^ ^
/ \ / \
| | | |
P C P C
| | | |
/-----/ \----\ /-----/ \----\
| | | |
printf("A") printf("B") printf("A") printf("B")
首先有一个 fork()
没有条件。这意味着 parent 和 child 进程都在程序的同一路径上继续。
然后是第二个 fork()
调用。原来的 parent 和 child 都会做这个分支。在新的 fork 中,新的 parent 进程将有一个 non-zero return 值,这意味着条件是 true
并且它们将打印 "A"
。新的 child 进程将有一个零 return 值,即 false
并且它们将继续打印 "B"
.
进程的确切顺序 运行 未指定,因此确切的输出将无法预测。但它会打印 "A"
两次和 "B"
两次。
我有这段我无法理解的代码。我了解 fork() 的基础知识,但我不了解此过程的层次结构树。 代码是这样的:
main()
{
fork();
if(fork()){
printf("A");
}
else{
printf("B");
}
}
输出是A A B B。这是怎么发生的?我明白为什么 A 被打印两次但为什么 B 被打印?分层树在这里如何工作?
输出是 A A B B -> 由于并发性,输出在运行之间可能会有所不同我有这个
所以逻辑如下:第一个 fork 在第一个 fork 之后再创建一个进程来执行相同的程序,这两个进程中的每一个都创建一个进程打印 B
然后打印 A
自己总共有 4 个进程
好的,让我们“画出”这个程序创建的进程树(使用 P
代表 parent 进程,C
代表 child 进程):
fork() ^ / \ | | P C | | /------------/ \------------\ | | fork fork ^ ^ / \ / \ | | | | P C P C | | | | /-----/ \----\ /-----/ \----\ | | | | printf("A") printf("B") printf("A") printf("B")
首先有一个 fork()
没有条件。这意味着 parent 和 child 进程都在程序的同一路径上继续。
然后是第二个 fork()
调用。原来的 parent 和 child 都会做这个分支。在新的 fork 中,新的 parent 进程将有一个 non-zero return 值,这意味着条件是 true
并且它们将打印 "A"
。新的 child 进程将有一个零 return 值,即 false
并且它们将继续打印 "B"
.
进程的确切顺序 运行 未指定,因此确切的输出将无法预测。但它会打印 "A"
两次和 "B"
两次。