Unix/Linux编程实践教程 有两道习题8.4/8.5
main() { int fd; int pid; char msg1[]="Test 1 2 3 ..\n"; char msg2[]="Hello, hello\n"; 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, hello\n"; 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
分析:
进程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, hello\n"; 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
原文:http://www.cnblogs.com/daijkstra/p/5138524.html