编写系统调用并阻止进程

Fer*_*nar 4 unix posix system linux-kernel

在UNIX中:读取系统调用将阻止该过程,直到完成为止。

如何系统调用的行为?在磁盘上写入时是否会阻止该进程?

对于写系统调用,我的意思是write(fd,bf,nbyte)过程调用。

Jan*_*dec 7

不,它只会阻塞该过程,直到缓冲区的内容复制到内核空间为止。这通常是很短的时间,但是在某些情况下,它可能会等待某些磁盘操作:

  • 如果没有可用页面,则必须释放一些页面。如果有干净的页面,则可以丢弃它们的内容(因为它们只是从磁盘复制而已),但是如果没有,则必须对某些页面进行清洗,这涉及写操作。由于页面会在几秒钟后自动清洗,因此,如果您有足够的内存,几乎不会发生这种情况。
  • 如果写入是在文件的中间,则可能需要读取周围的内容,因为页面缓存具有页面粒度(在大多数平台上对齐4 KiB块)。这种情况很少发生,因为很少会在不读取文件的情况下更新文件,如果您先阅读文件,则内容已经被缓存。

如果要等到数据真正达到目标,则需要继续使用fsync(2)