在我的程序中,由于某些特殊原因,我需要在内核空间中写入文件,尽管我知道不建议这样做。
我正在使用 vfs_write 在内核空间中写入文件,它工作正常。在一种情况下,有两个线程需要写入同一个文件。
从互联网上看,用户空间写入似乎是线程安全的,但是,我无法找到vfs_write是否是线程安全的。有人可以帮忙解决这个问题吗?
最佳答案
是的,vfs_write
是线程安全。
您唯一应该关心的是文件的位置,即您作为 pos
参数传递给函数的指针,在调用函数期间不应更改。
例如,您可以使用local变量作为文件的位置,在调用之前将实际位置加载到其中,将指针作为函数的参数传递给它,并在调用后更新实际位置。此技术用于 write
syscall 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
不会同步并发写入器之间的文件偏移量。并发写入器可能有用的使用场景包括:
- 仅附加:为文件设置
O_APPEND
标志。在这种情况下,传递给vfs_write
的文件位置将被忽略,每个写入器都会将数据附加到文件中。 - 仅重写:不为文件设置
O_APPEND
标志,并允许每个并发写入者仅修改文件中自己的部分。
关于Linux内核: is vfs_write thread safe?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35451081/