关于linux fork()函数的一道题

在linux平台下,看下面两段代码,试分析分别输出几个"-"。

#include<stdio.h>
#include<unistd.h>

int main(void)
{
    int i;
    for(i = 0; i < 2; ++i)
    {
        fork();
        printf("-");
    }
    return 0;
}

#include<stdio.h>
#include<unistd.h>

int main(void)
{
    int i;
    for(i = 0; i < 2; ++i)
    {
        fork();
        printf("-\n");
    }
    return 0;
}

这道题涉及到的知识点有,printf()函数的理解、"\n"的理解、进程创建与执行的过程、子进程资源与父进程资源关系。

unix上标准输入输出都是带有缓存的,一般是行缓存。对于标准输出,需要输出的数据并不是直接输出到终端上,而是首先缓存到某个地方,当遇到行刷新标志或者该缓存已满的情况下,才会把缓存的数据显示到终端设备上。ANSI C中定义换行符'\n'可以认为是行刷新标志。所以,printf函数没有带'\n'是不会自动刷新输出流,直至缓存被填满。

即:

"\n"是行刷新标识

如果有"\n",则立即输出并清空缓存

如果没有"\n",则等到缓冲区满了后再输出

--------------------------------------------------------------------------------------

第一个函数没有"\n",则输出需等到缓冲区满或进程结束时输出

而子进程是继承父进程的缓冲区的,所以父进程执行printf("-"),一方面给本身缓存增加了一个"-",同时又给其创建的子进程发送了一个"-"
经过分析可知会输出8个"-"
---------------------------------------------------------------------------------------
第二个函数有"\n"
则直接输出,缓冲区置为空,那么子进程继承父进程的缓冲区为空
经过分析可知会输出6个"-" 

图示如下所示:


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值