考虑以下代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i = 0; i < 2; i++)
{
fork();
printf(".");
}
return 0;
}
该程序输出8个点。那怎么可能呢?应该不应该有6个点?
考虑以下代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int i;
for(i = 0; i < 2; i++)
{
fork();
printf(".");
}
return 0;
}
该程序输出8个点。那怎么可能呢?应该不应该有6个点?
Answers:
该fork()
原始常常延伸的想象力。在感觉到它之前,您应该在纸上找出每个操作是什么,并说明处理的数量。不要忘记fork()创建了当前进程的近乎完美的副本。(对于大多数用途而言)最重要的区别是,fork()
父级和子级的返回值有所不同。(由于此代码忽略了返回值,因此没有区别。)
因此,起初只有一个过程。这将创建第二个过程,这两个过程都将打印点和循环。在第二次迭代中,每个进程都会创建另一个副本,因此有四个进程打印一个点,然后退出。因此,我们可以轻松地说明六个点,就像您期望的那样。
但是,printf()
真正的作用是缓冲其输出。因此,只有两个进程时的第一个点在写入时不会出现。这些点保留在缓冲区中,该缓冲区在fork()中重复。直到该过程即将退出时,才出现缓冲点。四个过程打印一个缓冲点,新的过程给出8个点。
如果您想避免这种情况,请fflush(stdout);
在之后致电printf()
。
fork()
不会创建2个然后退出,它只会再创建1个进程。
当我= 0时
处理_1:缓冲的文本= 1点
Process_2(由Process_1创建):缓冲的文本= 1点
当我= 1
Process_3(由Process_1创建):从Process_1继承1个缓冲点,并单独打印1个点。总共Process_3打印2个点。
Process_4(由Process_2创建):从Process_2继承1个缓冲点,并单独打印1个点。总共Process_4打印2个点。
Process_1:打印2个点(当i = 0时一个缓冲点,而i = 1时另一个缓冲点)
Process_2:打印2个点(当i = 0时一个缓冲点,而i = 1时另一个缓冲点)
最终输出:8点。:)