【Linux】fork进程,缓冲区简单理解

缓冲区

为什么会有缓冲区的存在?

屏幕是一个硬件设备,是由操作系统来管理的,因此printf打印的时候需要调用操作系统的接口才能完成,这个时候我们需要从用户态切换到内核态,这个开销是比较大的.

当printf的时候,会把内容先放入缓冲区中,缓冲区刷新后打印在屏幕上

刷新条件

printf将内容先写入到缓冲区中,缓冲区刷新到界面(屏幕)上的条件是:
(1)缓冲区放满
(2)缓冲区未满,强制刷新缓冲区到屏幕(方法一:\n;方法二:主动刷新:fflush(stdout));
(3)程序结束时,自动刷新缓冲区:exit方法;

三者满足一点即可

fork

PCB和PID:

PCB:进程控制块(进程描述符),进程控制块是用一个结构体struct task_struct来实现;

PID:进程唯一的标识符,相当于人的身份证,通过这个判断是不是一个进程

进程的状态:
就绪,阻塞,运行

fork如何复制进程:

fork是把已有的进程复制一份,当然把PCB也复制了一份,然后申请一个PID,子进程的PID=父进程的PID+1;

fork时是连缓冲区也会复制的

fork的时机:

fork产生的这个子进程不是从头开始执行的,而是从fork之后开始执行的,就是说fork下面的代码子进程才开始执行,具体的是说从返回值这里子进程开始执行,子进程不会再fork了,所以不会出现子进程再去fork产生一个子进程的问题.
也就是说:从返回值这里开始,父进程返回子进程的PID,子进程返回0;

如果要得到进程PID,可调用getpid,若要得到父进程PID,调用getppid

通过做题理解

1.此时打印几个A?

答案:6个,此时有\n,打印缓冲区立即刷新。

i=0时,fork一下,父进程创建子进程,各打印一个A

i=1时,fork一下,原来的父进程再次fork一个子进程,第一次fork的子进程也会fork一个子进程

此时共有4个进程,各打印一次A,4个A

所以共有2+4=6个A

2.若打印改成printf("A"),打印几个A?

注意:此时去掉/n,不会立即刷新缓冲区了

答案:8个A

i=0时,fork创建一个进程各打印一个A,此时缓冲区不刷新,屏幕上是没有A的

i=1时此时执行第10行,fork时

共有4个进程,缓冲区也会复制

此时再执行11行,打印A

之后仍不刷新缓冲区,屏幕没有打印A

直到执行到13行,exit时才会刷新缓冲区,打印出8个A

即:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值