1.父进程打开一个文件,fork之后子进程共享使用这个文件
由于fork创建的子进程的PCB是拷贝父进程的,子进程的PCB中的文件表指向打开文件的指针只是拷贝了父进程PCB中的值,所以父子进程会共享父进程fork之前打开的所有文件描述符。如下图:
现在有一个文件a.txt:
文件a.txt的内容为:abcdef
代码如下:
编译并运行以上代码:
结果分析:
通过运行结果可以发现,父进程如果读走了a,那么子进程就会从a的后边开始读,读到了b,子进程不会再把a读一遍,父进程也是一样,从b的后边开始读,读到了c,子进程再从c的后边开始读,读到了d。也就是说,父进程和子进程并没有将一个字符反复去读取,读取的时候我们可以发现,父子进程读文件的文件偏移量是共享的。所以,父进程打开一个文件,fork之后,这个文件是父子进程共享这个文件。
在运行一次编译好的代码,运行的结果为:
这是因为,子进程比父进程先读到了字符c,但是输出的时候比父进程晚了一点。
2.先fork,再打开一个文件,父子进程不共享这个文件
现在有一个文件a.txt:
文件a.txt的内容为:abcdef
有以下代码:
编译并运行,结果如下:
结果分析:
根据结果可以看到,父进程读了字符a,子进程也读了字符a,父进程读b,子进程也读b。明显看出,这一次父子进程读文件的文件偏移量是没有共享的,父进程和子进程各读各的。相当于两个完全没有关系的进程去读取整个文件,子进程和子进程互不影响。