《linux编程实践教程》中的两个习题, 有关fork的-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

《linux编程实践教程》中的两个习题, 有关fork的

2016-06-20 10:31:26 2318 1

screenshot
screenshot
然后结果为:
screenshot
不太理解为何父进程已经把文件关了,而子进程依旧可以写入。
而且fork()创建的子进程不是应该执行fork之后的代码吗,为何题2又可以把第一句话写入

取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:43:45

    首先要理解fork的一个特性: 父进程的所有打开文件描述符都会被复制到子进程中,父、子进程的每个相同的打开描述符共享一个文件表项。如下图(摘自APUE)所示。另外,在文件表中还有一项:打开文件引用计数,引用这个文件对象的描述符数(dup和fork都会增加这个计数,第一次open会使此计数为1,close会减小此计数,为0时销毁文件对象)。所以在程序的运行过程中,不管是父进程还是子进程先close(fd)或fclose(fp),该文件表依然存在并没有被销毁,只有当文件表中的打开文件引用计数为0时才会销毁这个文件表对象。
    题1中的I/O都是通过Linux系统调用来完成的,这些函数也常被称为不带缓冲的I/O(unbuffered I/O)。所以每一次调用都会立即写入文件中。而对于题2中的标准I/O库函数来说,都是带缓冲的,文件一般都是全缓冲,也就是说一定要把缓冲区填满才能进行实际的I/O操作。在执行语句fprintf(fp, "%s", msg1);时,由于没有填满缓冲区而实际的I/O操作并未完成。这时却调用了fork函数,这个函数同时也会把该缓冲区复制一份给子进程,这样在父、子进程中就各有一份msg1,当缓冲区填满后就会被刷新以进行实际的I/O操作(写入文件)。int fflush ( FILE * stream );函数能够提供手动进行刷新缓冲区,楼主可以试试在将msg1写入文件这条语句后面加上fflush(fp);则得出的结果将会和题1一样。
    screenshot

    0 0
相关问答

29

回答

云计算之路:为什么要选择云计算

cnblogs 2013-03-27 10:22:27 143102浏览量 回答数 29

162

回答

惊喜翻倍:免费ECS+免费环境配置~!(ECS免费体验6个月活动3月31日结束)

豆妹 2014-10-29 17:52:21 226180浏览量 回答数 162

145

回答

【新手入门】云服务器linux使用手册

fanyue88888 2012-11-26 17:14:18 157712浏览量 回答数 145

18

回答

阿里云开放端口权限

xcxx 2016-07-20 15:03:33 646819浏览量 回答数 18

38

回答

安全组详解,新手必看教程

我的中国 2017-11-30 15:23:46 259853浏览量 回答数 38

294

回答

Linux Bash严重漏洞修复紧急通知(已全部给出最终修复方案)

qilu 2014-09-25 13:26:50 434593浏览量 回答数 294

249

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 305650浏览量 回答数 249

97

回答

Redhat/CentOS一键安装web环境全攻略

xiaofanqie 2011-08-11 14:51:38 123710浏览量 回答数 97

40

回答

阿里云ecs从购买到环境搭建和建站!!(phpstudy一件包)

梦丫头 2014-07-29 20:51:49 162531浏览量 回答数 40

24

回答

【精品问答】python技术1000问(1)

问问小秘 2019-11-15 13:25:00 475712浏览量 回答数 24
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载