linux内核:vfs_write线程安全吗?

时间:2016-02-17 08:09:30

标签: linux multithreading file linux-kernel

在我的程序中,由于某些特殊原因,我需要在内核空间中编写文件,尽管我知道不建议这样做。

我正在使用vfs_write在内核空间中写入文件,它工作正常。在一种情况下,有两个线程需要写入同一个文件

从互联网上看,似乎用户空间写入是线程安全的,但是,我找不到 vfs_write是否是线程安全的。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

是的,vfs_write 线程安全

你应该关心的唯一事情是在调用函数期间不应该更改文件的位置,即传递给函数pos参数的指针。

例如,您可以使用 local 变量作为文件的位置,在调用之前将实际位置加载到其中,将指针作为函数的参数传递给它,并在调用之后更新实际位置。此技术用于write 系统调用 implementation

loff_t pos = file_pos_read(f.file);
ret = vfs_write(f.file, buf, count, &pos);
if (ret >= 0)
   file_pos_write(f.file, pos);

如您所见,vfs_write不会在并发编写器之间同步文件中的偏移量。并发编写器的可能有用使用方案包括:

  1. 仅附加:为文件设置O_APPEND标志。在这种情况下,传递给vfs_write的文件中的位置将被忽略,每个编写器都会将数据附加到文件中。
  2. 仅重写:不要为文件设置O_APPEND标志,并允许每个并发编写器仅修改其自己的文件部分。