考虑一下这个例子(为了简洁起见,我省略了标题和错误检查):
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%dump (表示缺少换行符的%)。
为什么dump不包含
zzllo我的想法是,在fork之后,对于同一个进程有两个文件描述符,但是每个文件描述符都有自己的偏移量。为什么写到一个描述符会影响另一个描述符?
发布于 2022-09-06 18:52:05
进程有自己的文件描述符,但是这些进程充当指向共享打开文件描述的引用计数指针(为每个open创建一个单独的开放文件描述)。共享开放文件描述是允许,例如shell脚本进行如下操作的原因。
(
/usr/bin/echo hello
/usr/bin/echo world
) > some_file让some_file同时包含hello和world,而不使用后者覆盖前者(就像他们(没有特别的努力)一样,如果他们写信给终端,就不会覆盖对方)。
它还允许应用程序修改终端设置(stty)、实用程序(如flock (在共享文件描述中设置锁)以及其他可能的东西)。
https://stackoverflow.com/questions/73626470
复制相似问题