在一個POSIX系統,通過一個fork
調用由子進程繼承文件描述符指向同一個文件描述符在全系統表。下面是從Linux手冊頁相關的報價爲開放式(2):
術語打開文件的描述是使用POSIX指 在打開文件的全系統表中的項目之一... 當文件描述符被複制(用DUP(2)或類似的),則 重複是指相同的開放文件描述作爲原始 文件描述符,並且兩個文件描述符因此共享 文件偏移量和文件狀態標誌。這種共享也可以進程之間發生 :經由叉(2)創建繼承父的文件描述符 重複子進程,和這些重複 指代相同的打開的文件的描述。
這意味着,父母和孩子分享文件偏移量相同的信息,並在一個讀將改變所有其它進程的偏移看到。如果在讀取之間沒有並行讀取進程,則不會有兩個進程讀取相同的數據。
您可以在下面的測試程序,它打印在命令行給出的文件的前20個字符在行動看到這一點。 (如果位置信息不共享,則會打印前10個字符兩次)。
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
char buffer[256];
int
main(int argc, char ** argv)
{
int fd = open(argv[1], O_RDONLY);
fork();
read(fd, buffer, 10);
write(1, buffer, 10);
return 0;
}
無論其,這是一個巨大的「但是」,這僅適用於低級別的系統調用接口讀取文件:open(2)
,read(2)
等,如果你正在使用緩衝更高級別界面,如fgets
和其他功能stdio.h
,事情變得複雜。當進程分叉,即使他們繼承指向單一的全系統,共享的內核文件信息結構文件描述符的副本,他們也會沿用使用stdio.h
電話用戶空間的緩存信息獨立份,並且這個緩衝信息包括它自己的偏移(顯然是緩衝區),它們在進程之間不同步。