fork函数(一次调用,两次返回):

fork的运行规则:以父进程为模板,创建子进程
1.会把父进程的PCB拷贝一份,稍加修改,成为子进程的PCB
2.会把父进程的虚拟地址空间拷贝一份,作为子进程的地址空间(拷贝方式是写时拷贝(偷懒行为):父子进程共用一份代码,但是各有一份数据;进程的程序替换可以解决共用一份代码的问题,让父子进程各自执行自己的代码)
3.fork返回会在父子进程中各自返回(父进程返回子进程的PID,子进程返回0);在fork之后继续往下执行代码(fork失败会返回-1,失败的原因有:1)内存不够;2)进程太多)
4.父子进程的执行顺序没有确定的先后关系,全靠调度器实现

执行下边一段代码,打印几个“=”;加上fflush(stdout)后打印几个“=”?

#include<stdio.h>
#include<unistd.h>
int main()
{
	int i=0;
	for(i=0;i<2;++i)
	{
		fork();
		printf("=");
		//fflush(stdout);
	}
	return 0;
}

fork()函数
针对这个问题我们看图片:进程A,B,C,D的关系是进程A是进程B和进程C的父进程,进程B又是进程D的父进程。
未加flush结果:
当函数刚进入第一次进入for循环,i=0时,执行fork函数便有了父进程A,A向缓冲区写入一个“=”,A进程创建的子进程B拷贝了A的数据,因此进程B的缓冲区也有了一个“=”;
当第二次进入for循环,A进程又向缓冲区写入一个“=”,同样,B进程也向缓冲区写入一个“=”;然后A、B进程分别创建了一个子进程C和D。C和D进程分别拷贝了A,B进程的缓冲区,所以它们的缓冲区各自有了两个“=”;所以最后函数结束总共打印了8个“=”;
加上发flush结果:
首先明确一个问题,也是我们之前命令行进度条那篇讲过的问题,刷新缓冲区问题:

1)缓冲区满了就会把缓冲区的内容放到显示器
2)如果遇到\n就会把缓冲区的内容放到显示器;如果是把数据写到文件上\n就不会刷新缓冲区
3)程序结束的时候也可能会刷新缓冲区
4)fflush手动刷新缓冲区
所以我们的这个问题理解起来就简单一些:
当函数刚进入第一次进入for循环,i=0时,执行fork函数便有了父进程A,A向缓冲区写入一个“=”,A进程创建的子进程B拷贝了A的数据,因此进程B的缓冲区也有了一个“=”;
接下来执行fflush(stdout);刷新缓冲区,把进程A和B缓冲区的内容打印到显示器并清空缓冲区;当第二次进入for循环,A进程向缓冲区写入一个“=”,同样,B进程也向缓冲区写入一个“=”;然后A、B进程分别创建了一个子进程C和D。C和D进程分别拷贝了A,B进程的缓冲区,(由于之前已经刷新过缓冲区,所以A和B进程缓冲区各有一个=“)所以它们的缓冲区各自只有一个“=”;所以最后函数结束总共打印了6个“=”;

相关文章:

  • 2021-12-03
猜你喜欢
  • 2021-06-03
  • 2022-01-02
相关资源
相似解决方案