【发布时间】:2017-12-29 14:11:23
【问题描述】:
一个线程写入文件(甚至删除它),另一个线程同时为该文件调用 sendfile() 以获取重叠位置。
这里的预期行为是什么?
另外,如果我的理解是正确的,sendfile 调用只会向套接字添加一条记录(文件描述、位置、长度)并返回给调用者。 (还没有复制到套接字的缓冲区?),所以即使 sendfile() 在修改文件之前返回,操作系统也依赖于文件的存在,直到文件被完全发送。
那么在文件发送之前任何修改的结果是什么?
【问题讨论】:
-
即使你删除了一个打开的文件,内核对该文件的句柄(以及你的进程的
fd)将保持文件“活动”直到它被关闭。这也是您可以“移动”打开文件而不影响其fd句柄的原因。至于由编辑引起的比赛条件……嗯,这是一场比赛。如果 sendfile 在编辑后运行,它将在编辑后的版本上运行。 -
写入可能会被正在运行的程序、操作系统甚至 HD 控制器缓冲。甚至可能是所有三个,连续。最佳做法是在多线程程序中读取和写入同一个文件时添加原子保护。
-
@usr2564301 HD 控制器与应用程序无关。 Linux 有统一的缓冲区缓存,所有进程使用相同的内核文件缓冲区。