考慮這個例子(為簡潔起見,我省略了標題和錯誤檢查):
int main() {
int fd;
fd = open("dump", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);
if ( fork() > 0 ) {
sleep(1);
printf("Current offset: %li\n", (long)lseek(fd, 0, SEEK_CUR);
write(fd, "zz", 2);
}
else {
write(fd, "hello\n", 6);
}
close(fd);
return 0;
}
該程式(在 Linux 上運行)列印
Current offset: 6
到終端和
hello
zz%
to dump(%表示缺少換行符)。
為什么不dump包含
zzllo
?
我的想法是,在 之后fork,同一個行程有兩個檔案描述符,但每個都有自己的偏移量。為什么寫入一個描述符會影響另一個?
uj5u.com熱心網友回復:
行程有自己的檔案描述符,但它們充當指向共享檔案描述的參考計數指標。檔案描述的共享允許例如 shell 腳本做一些事情,例如
(
/usr/bin/echo hello
/usr/bin/echo world
) > some_file
并且some_file包含兩者hello并且world沒有后者覆寫前者(就像如果他們寫信給終端,他們不會(沒有特別努力)相互覆寫)。
它還允許應用程式修改終端stty設定flock(
(順便說一句,您應該使用lseek檔案描述符。fseek接受FILE指標)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/505044.html
