首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • fork() 函数如果用文件描述符和文件指针得到的不同结果! [已结贴,结贴人:yangzhifu]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangzhifu
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    • 揭帖率:
    发表于:2008-08-23 17:51:37 楼主
    文件描述符大开
    C/C++ code
    #include <stdio.h> #include <string.h> int main() { int fd; int pid; char msg1[] = "Test 1 2 3 .. \n" ; char msg2[] = "Hello.hello \n " ; 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/C++ code
    #include <stdio.h> #include <string.h> int main() { FILE *fp; int pid; char msg1[] = "Test 1 2 3 .. \n" ; char msg2[] = "Hello.hello \n " ; if (( fp = fopen ("testfile2" , "w" )) == NULL ) return 0 ; fprintf(fp,"%s",msg1 ); if ( ( pid = fork () ) == -1 ) return 0 ; fprintf(fp,"%s",msg2 ); fclose ( fp ) ; return 1 ; }

    结果
    Test 1 2 3 ..
    Hello.hello
      Test 1 2 3 ..
    Hello.hello
    为什么会有这样的不同?

    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • unilgr
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 20:02:431楼 得分:20
        系统调用写文件:用户空间无缓存管理,调用write后逻辑上可以认为msg1已经写入文件(虽然还有page cache和disk cache),fork后,父子进程只各输出msg2
        标准IO库函数写文件:默认为全缓存,调用fprintf后msg1只是输出到FILE*管理的用户缓存区里,fork后,子进程copy了父进程的很多数据包括刚才的缓存区中的msg1,所以最终父子进程各输出一个msg1
        总之,问题的关键在于是否缓存输出数据
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yangzhifu
    • 等级:
    • 可用分等级:
    • 总技术专家分:
    • 总技术专家分排名:
    发表于:2008-08-23 20:11:452楼 得分:0
    了解了,说到了重点(子进程copy了父进程的很多数据包括刚才的缓存区中的msg1) ,谢谢!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved