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

关于fork,系统调用,库函数的问题

    来源: 互联网  发布时间:2017-02-23

    本文导语:  一段很简单的输入字符到文件的代码,先是使用系统调用: #include  #include  #include  int main() {        int fd;        int pid;        char msg1[]="Test 1 2 3 ..n";        char msg2[]="Hello,  hellon";        if...

一段很简单的输入字符到文件的代码,先是使用系统调用:

#include 
#include 
#include 

int main()
{
       int fd;
       int pid;
       char msg1[]="Test 1 2 3 ..n";
       char msg2[]="Hello,  hellon";
       if((fd=creat("testfile",0644))==-1)
               return 0;
       if(write(fd,msg1,strlen(msg1))==-1)
               return 0;
       if((pid=fork())==-1)
               return 0;
       if(write(fd,msg2,strlen(msg2))==-1)
               return 0;
       close(fd);
       return 1;
}

执行后结果:

Test 1 2 3 ..
Hello,  hello
Hello,  hello


再使用c的库函数重写该程序:

#include 
#include 


int main()
{
        FILE *fp;
        int pid;
        char msg1[]="Test 1 2 3 ...";
        char msg2[]="Hello,   hello";
        if((fp=fopen("testfile2","w"))==NULL)
                return 0;
        fprintf(fp,"%s      pid:%dn",msg1,getpid());
        if((pid=fork())==-1)
                return 0;
        fprintf(fp,"%s      pid:%dn",msg2,getpid());
        fclose(fp);
        return 1;
}

执行后结果是:

Test 1 2 3 ...      pid:8795
Hello,   hello      pid:8795
Test 1 2 3 ...      pid:8795
Hello,   hello      pid:8796

为什么使用库函数的时候父进程会打印三次,我完全不能理解。

|
因为FILE对于文件使用 _IOFBF 全缓冲, n是不会冲刷buffer的。

所以fork后,子进程的fp->buffer里的内容就是父进程写出的但还留在buffer里的内容,子进程继续fprintf就是追加到buffer,最后父子进程分别关闭,各自冲刷各自的2行数据,一共4行。

|
fprintf只是写到磁盘缓冲里,并没有写磁盘文件. 
在fprintf后面加一句fflush(fp);(fp是你的文件指针)就可以了
fprintf的确每fork一个进程才写一次,因为必须写满缓冲后再批量写磁盘的原因,你会感觉文件是批量生成的.

|
#include 
#include 


int main()
{
        FILE *fp;
        int pid;
        char msg1[]="Test 1 2 3 ...";
        char msg2[]="Hello,   hello";
        if((fp=fopen("testfile2","w"))==NULL)
                return 0;
        fprintf(fp,"%s      pid:%dn",msg1,getpid());
        fflush(fp);                   //这样就好了
        if((pid=fork())==-1)
                return 0;
        fprintf(fp,"%s      pid:%dn",msg2,getpid());
        fclose(fp);
        return 1;
}


|
说的再细一点吧:
fprintf只是写到磁盘缓冲里,fork之后,连带这个磁盘缓冲也一起复制了,而且还不输出,直到fclose(fp)了,才强制刷新磁盘缓冲区,写进磁盘文件。
可以,在fclose(fp)前加个sleep(20);然后在这20秒内看testfile2,不会发现什么也没有,20秒后就一次性全都写进去了。

    
 
 

您可能感兴趣的文章:

  • 还是有关fork的问题,fork在一个函数中调用,我被搞胡涂了
  • 执行一个main函数程序时,unix操作系统调用什么创建进程?fork?newproc?
  • Linux fork函数的系统调用实现过程是什么呢?
  • 创建进程的系统调用clone()和fork()
  • Unix中fork系统调用
  • 调用fork操作后,子进程有返回,父进程挂死,什么原因?
  • 关于跨越fork调用使用管道,会打开4个文件描述符?
  • fork~exec不会使用,请问怎么使用,我只是想简单的用进程调用一个程序。
  • fork()首次调用新创建进程时,其入口在哪里?在线等等
  • 急!急!fork()一个子进程,然后再子进程中调用execl出了问题。
  • 问个很简单的问题,求进程调用FORK()的代码
  • 怎样编写一段程序,要求调用fork并在子进程中建立一个新的对话期。验证子进程变成了进程组长而且不再有控制终端。
  • 各位前辈,当代码执行一个系统调用fork()后,为什么如果共享页设置了写时拷贝位,在父进程之前调度子进程将具有优越性?内核如何能使子进
  • 汇编调用fork的问题
  • linux下C语言编程调用fork的问题
  • 有关fork()调用的初级问题,急急急!!!高分求助。
  • linux内核高手进!关于调用__fork()时0号进程的子进程才能与父进程共享PID的困惑
  • 关于fork系统调用
  • 调用两次fork如何避免僵死进程呢?
  • 问个有难度的问题,2.6内核fork调用的怎么是clone
  • 如何理解fork函数返回2次啊?
  • fork函数的源代码在哪呢
  • linux的fork()函数
  • minGW编译带fork函数的问题?
  • Linux fork() 函数
  • 关于fork()函数
  • fork函数的理解。。
  • fork函数,在线等待,马上结贴。谢谢!!!!!!!!!!!!
  • 关于fork函数
  • fork函数详解?
  • fork函数的处理流程
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 一个fork的问题
  • 新手的问题关于fork?
  • fork() 父子进程执行顺序问题
  • fork的问题
  • 请教一个关于fork的问题。
  • 一个简单的fork问题(那个高手来帮忙呀)
  • 关于fork创建进程的一个问题
  • fork与socket问题
  • 关于fork()的一个问题!?
  • 问个关于fork的小问题
  • fork问题
  • fork()复制进程的问题2
  • fork()问题
  • linuxC中的fork问题,请教大侠帮忙解答
  • 一个简单的fork()问题,求解···在线等
  • fork 带来的问题!
  • fork()复制进程的问题。
  • linux下fork子进程后的问题
  • 用fork()往文件里写数据问题
  • 请教进程fork()相关的,执行效率的问题,看我这段程序.
  • 奇怪:程序一fork子进程时就停住了,似乎根本不能fork子进程啊?
  • unix中的fork2与fork有设么区别?
  • 程序在fork前申请了内存若干,在fork后子进程是否需要释放父进程之前申请的内存
  • 急于明白Fork的用法.请提供中文解释.谢谢.
  • 关于fork的不解
  • 弱弱的问:fork和exec的区别是什么?
  • 关于fork的讨论
  • 关于fork的疑问?
  • fork之后的输出
  • exit和fork是什么关系?他们是怎么配合使用的?
  • 请教 linux的fork从什么版本开始支持COW?


  • 站内导航:


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

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

    浙ICP备11055608号-3