美文网首页
fork之前的printf为什么打了两次

fork之前的printf为什么打了两次

作者: 动感新势力fan | 来源:发表于2016-11-23 16:46 被阅读24次

fork()前的printf打印两次的问题
这几天在看Linux应用编程, 测试了一下里面所讲的fork函数。 不是说子进程会从fork语句处开始运行吗? 为啥之前的printf内容还会被输出。 在网上找了一下,大概是这么回事:
———————————————————————————–
main()
{
int a;
int pid;
printf(“AAAAAAAA”); // 这里为什么会被print 2次
pid=fork();
if(pid==0){
printf(“ok”);}
else if(pid>;0){
printf(“is ok\n”);
}
printf(“BBBBBBB”);
}
—————————————————————————————
如果你将 printf(“AAAAAA”) 换成 printf(“AAAAAA\n”) 那么就是只打印一次了.
主要的区别是因为有了一个 \n 回车符号
这就跟Printf的缓冲机制有关了,printf某些内容时,操作系统仅仅是把该内容放到了
stdout的缓冲队列里了,并没有实际的写到屏幕上
但是,只要看到有 \n 则会立即刷新stdout,因此就马上能够打印了.
运行了printf(“AAAAAA”) 后, AAAAAA 仅仅被放到了缓冲里,再运行到fork时,缓冲里面
的 AAAAAA 被子进程继承了
因此在子进程度stdout缓冲里面就也有了 AAAAAA.
所以,你最终看到的会是 AAAAAA 被printf了2次!!!!
而运行 printf(“AAAAAA\n”)后, AAAAAA 被立即打印到了屏幕上,之后fork到的子进程里
的stdout缓冲里不会有 AAAAAA 内容
因此你看到的结果会是 AAAAAA 被printf了1次!!!!

相关文章

  • fork之前的printf为什么打了两次

    fork()前的printf打印两次的问题这几天在看Linux应用编程, 测试了一下里面所讲的fork函数。 不是...

  • 多进程知识点总结1

    1.fork函数 此处需要注意的是 当调用fork方法 ,之后的代码会运行两次os 中的fork只能在liunx中...

  • io缓冲

    此段代码会输出8个“*”,因为printf标准输出默认是行缓存,fork子进程会把父进程缓存区同样copy一份。缓...

  • 【持续更新】C语言 第二天学习笔记(第一章)

    一、【理解】复习昨天知识二、【掌握】printf函数详解 ~复习:我们之前所学的printf函数的用法 print...

  • 类进程守护(fork)

    注意:fork类进程守护只适合大部分4.3之前系统 这里需要解释下为什么4.3之前可行,之后不可行在源码activ...

  • 慢慢的变好

    记得在上周,打了两次鸡血,先后两次开通每日挑战,为什么要两次开通,大家应该清楚,是第一次没有坚持下来,挑战失败了,...

  • 10-11

    printf printf "value=%s\n" "${value}" read printf“0”read ...

  • fork之前的缓冲区问题

    fork 系统调用 Description fork() creates a new process by ...

  • Shell printf 命令

    Shell printf 命令 printf 命令模仿 C 程序库(library)里的 printf() 程序。...

  • Shell printf 命令

    Shell printf 命令 printf 命令模仿 C 程序库(library)里的 printf() 程序。...

网友评论

      本文标题:fork之前的printf为什么打了两次

      本文链接:https://www.haomeiwen.com/subject/qdevpttx.html