以下代码会打印几个"A"?
例1.代码如下:
int main(int argc, char* argv[],char* envp[])
{
for(int i = 0;i < 2; i++ )
{
fork();
printf("A\n");
}
exit(0);
}
代码分析:
//父进程
for(int i = 0;i < 2; i++ )
{
fork();
printf("A\n");
}
此时i=0,进入循环,执行fork,产生一个子进程1:
//子进程1
for(int i = 0;i < 2; i++ )
{
fork();
printf("A\n");
}
父进程执行完fork之后会执行printf("A\n");
,输出"A"。然后执行for循环中的i++
,i的值等于1,符合i<2
,再次进入循环,又执行一次fork,再产生一个子进程2,并且会再执行printf("A\n");
,输出"A"。然后执行for循环中的i++
,i的值等于2,不符合i<2
,所以不进入循环。此时子进程2的for循环中的i的值变为了1:
//子进程2
for(int i = 1;i < 2; i++ )
{
fork();
printf("A\n");
}
子进程2是由父进程第二次进入循环的时候复制而来的,而子进程2中的fork在父进程进入第二次循环执行fork产生子进程2的时候已经执行完了,所以子进程2直接执行printf("A\n");
,输出"A"。
这时,父进程的循环就结束了,接下来看子进程1的循环,父进程第一次执行fork的时候产生的子进程1如下:
//子进程1
for(int i = 0;i < 2; i++ )
{
fork();
printf("A\n");
}
这时子进程1for循环中i的值等于0,进入循环,这里的fork在父进程第一次进入循环执行fork产生子进程1的时候就已经执行完了,所以直接执行printf("A\n");
,输出"A"。然后执行for循环中的i++
,i的值等于1,符合i<2
,再次进入循环,执行fork产生子进程3,并且执行printf("A\n");
,输出"A"。子进程3如下:
//子进程3
for(int i = 1;i < 2; i++ )
{
fork();
printf("A\n");
}
此时,子进程3是由子进程1第二次进入循环复制而来的,所以子进程3中的fork在子进程1第二次进入循环执行fork产生子进程3的时候就已经执行完了,所以子进程3直接执行printf("A\n");
,输出"A"。
运行结果:
一共输出6个A。
例2.代码如下:
int main(int argc, char* argv[],char* envp[])
{
for(int i = 0;i < 2; i++ )
{
fork();
printf("A");
}
exit(0);
}
代码分析:
以上代码中在fork之后的printf("A");
这条语句中没有"\n",所以输出的"A"没有办法输出到屏幕上,只能放在父进程的缓冲区,在fork之后,缓冲区所占的空间要复制给子进程。当i=0进入循环,第一次执行fork之后产生子进程1,然后执行printf("A");
,这时"A"并没有输出到屏幕上,而是放到了缓冲区中,当i++之后,i等于1的时候再fork的时候会把缓冲区中的内容"A"复制一份给子进程2。所以子进程2在输出的时候会打印两个"A",而父进程中放到缓冲区的"A"会在父进程两次循环结束之后退出程序之后输出,存放到缓冲区中的"A"并不会不输出,而是在程序结束后输出。同理,子进程3在输出的时候会打印两个"A",而子进程1中放到缓冲区的"A"会在子进程1两次循环结束之后退出程序之后输出。所以这个题的答案会比第一个题的答案多出来两个"A"。
运行结果: