当前位置:  技术问答>linux和unix

fork 函数问题,UNIX环境高级编程里面143页的问题

    来源: 互联网  发布时间:2015-12-08

    本文导语:  #include  #include  #include  #include  #include  int glob = 6; char buf[] = "sdtoutn"; int main(void) {     int var;     pid_t pid;     var = 88;     if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1 )         printf("write ...

#include 
#include 
#include 
#include 
#include 

int glob = 6;
char buf[] = "sdtoutn";
int
main(void)
{
    int var;
    pid_t pid;

    var = 88;
    if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1 )
        printf("write error");

    printf("befor forkn");

    if ( (pid = fork())  d
/home/test$ cat d
sdtout
befor fork
pid = 30410, glob =7, var = 89
before exit
befor fork
pid = 30409, glob =6, var = 88
before exit

还是不明白为什么这两种方式输出的before fork 次数不一样。
书上的解释没有看明白

|
这个程序的关键之处在于理解函数printf,它是一个带缓冲的函数。
在标准输出到终端设备的时候,printf在三种情况下会立即输出到终端:
1、在字符串结尾带有换行符n
2、用强行输出函数fflush
3、在缓冲区中缓冲的数据已经满的时候。
在这三种情况下会立即输出到终端设备(注意这是讲的是终端设备),否则的话就暂存在缓冲区中,等待以上三个条件之一满足的时候再执行输出到终端,并清空缓冲区。

在执行a.out > d的时候执行了输出重定向(一般用dup2实现),这时的输出设备不再是标准终端设备(如显示器),所以在这种情况下printf会把输出的字符串缓存在缓冲区里,而不会立即输出。在执行fork之后,父子进程各有了一份该缓冲区的缓存内容,所以第二个"before fork"是由父进程的中相应的缓存内容中打印出来的。

而在直接执行a.out的时候,是直接输出到标准终端设备的(因为满足了条件一后面有n),并且清空了缓存,所以只打印了一个"before fork"。

可是为什么不会出现两个"stdout"呢?因为write函数是不带缓存的,是直接输出的,也就没有了以上的问题。

    
 
 

您可能感兴趣的文章:

  • 还是有关fork的问题,fork在一个函数中调用,我被搞胡涂了
  • 一个fork的问题
  • 新手的问题关于fork?
  • fork() 父子进程执行顺序问题
  • fork()函数入门级问题:fork()与进程数
  • fork的问题
  • 请教一个关于fork的问题。
  • minGW编译带fork函数的问题?
  • 一个简单的fork问题(那个高手来帮忙呀)
  • 关于fork创建进程的一个问题
  • fork与socket问题
  • 关于fork()的一个问题!?
  • 问个关于fork的小问题
  • fork问题
  • fork()复制进程的问题2
  • fork()问题
  • linuxC中的fork问题,请教大侠帮忙解答
  • 一个简单的fork()问题,求解···在线等
  • fork 带来的问题!
  • fork()复制进程的问题。
  • 如何理解fork函数返回2次啊?
  • fork函数的源代码在哪呢
  • linux的fork()函数
  • Linux fork() 函数
  • 关于fork()函数
  • fork函数的理解。。
  • fork函数,在线等待,马上结贴。谢谢!!!!!!!!!!!!
  • 关于fork函数
  • fork函数详解?
  • fork函数的处理流程
  • 执行一个main函数程序时,unix操作系统调用什么创建进程?fork?newproc?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux下C语言编程调用fork的问题
  • c在linux下编程fork()遇到问题了。
  • Linux系统中C语言编程创建函数fork()执行解析
  • 奇怪:程序一fork子进程时就停住了,似乎根本不能fork子进程啊?
  • unix中的fork2与fork有设么区别?
  • 程序在fork前申请了内存若干,在fork后子进程是否需要释放父进程之前申请的内存
  • 急于明白Fork的用法.请提供中文解释.谢谢.
  • 关于fork的不解
  • 弱弱的问:fork和exec的区别是什么?
  • 关于fork的讨论
  • 关于fork的疑问?
  • fork之后的输出
  • exit和fork是什么关系?他们是怎么配合使用的?
  • 请教 linux的fork从什么版本开始支持COW?
  • c++ 和 fork
  • "fork(2)" 中这个2表示什么意思
  • 创建一个子进程,什么时候该用clone()而不是fork()?
  • fork()的疑问
  • 我对 fork() 意见相当大大
  • 请教,关于fork的用法?
  • fork getpid 返回值
  • PHP建站系统 Fork CMS
  • 关于fork(2)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3