Unix/Linux编程实践教程 有两道习题8.4/8.5
main()
{
int fd;
int pid;
char msg1[]="Test 1 2 3 ..n";
char msg2[]="Hello, hellon";
fd=creat("testfile",0644);
write(fd,msg1,strlen(msg1));
pid=fork();
write(fd,msg2,strlen(msg2));
close(fd);
}
8.4输出是:
Test 1 2 3 ..
Hello, hello
Hello, hello
但是:
main()
{
FILE *fp;
int pid;
char msg1[]="Test 1 2 3 ..n";
char msg2[]="Hello, hellon";
fp=fopen("testfile2","w");
fprintf(fp,"%s",msg1);
pid=fork();
fprintf(fp,"%s",msg2);
fclose(fp);
}
8.5输出是:
Test 1 2 3 ..
Hello, hello
Test 1 2 3 ..
Hello, hello
分析:
先来看下“STDOUT_FILENO”和“FILE stdout”的区别:stdin / stdout / stderr是FILE类型,供标准C++一级提供的文件操作函数库使用,定义在头文件
2、执行flush语句;
3、执行endl语句(printf是"n");
4、关闭文件。综上所述,8.5的代码在主线程因为关闭文件才将字符全部输出到文件中,因此文件所有内容都是两份,而类比forkdemo1.c情况,代码执行情况都是一样的,msg1这句已经执行,但是内容在缓冲区中并未被输出,直到碰见关闭文件才将内容全部输出。“上图来自The Linux Programming Interface - 5.5 Duplicating File Descriptors”
进程A的fd1和fd20这种就是dup类系统调用的结果,
进程A的fd2和进程B的fd2就是fork的结果(fork之后指向相同的文件),
进程A的fd0和进程B的fd3最终指向同一个inode,这是这两个进程都调用过open的结果,此时两个文件不共享文件内的偏移,
文件偏移是存放在第二个表中的,所以不管是dup还是fork,都是共享同一组偏移.
将程序改为:增加一行fflush
main()
{
FILE *fp;
int pid;
char msg1[]="Test 1 2 3 ..n";
char msg2[]="Hello, hellon";
fp=fopen("testfile2","w");
fprintf(fp,"%s",msg1);
fflush(fp);
pid=fork();
fprintf(fp,"%s",msg2);
fclose(fp);
}
输出结果两者就是一样的。
参考资料:
关于fork之后父子进程的文件描述符关系有些疑问?-Linux环境编程-ChinaUnix.net
http://bbs.chinaunix.net/thread-4166362-1-1.html
Linux学习之"fork函数" - lq0729 - 博客园
http://www.cnblogs.com/lq0729/archive/2011/10/24/2222536.html
原文链接: https://www.cnblogs.com/daijkstra/p/5138524.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/227608
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!