【发布时间】:2016-05-28 19:48:41
【问题描述】:
在我的程序中,由于某些特殊原因,我需要在内核空间中写入文件,尽管我知道不推荐这样做。
我正在使用 vfs_write 在内核空间中写入文件,它工作正常。在一种情况下,有两个线程需要写入同一个文件。
从互联网上看,用户空间写入似乎是线程安全的,但是,我找不到 vfs_write 是否是线程安全的。有人可以帮忙吗?
【问题讨论】:
标签: linux multithreading file linux-kernel
在我的程序中,由于某些特殊原因,我需要在内核空间中写入文件,尽管我知道不推荐这样做。
我正在使用 vfs_write 在内核空间中写入文件,它工作正常。在一种情况下,有两个线程需要写入同一个文件。
从互联网上看,用户空间写入似乎是线程安全的,但是,我找不到 vfs_write 是否是线程安全的。有人可以帮忙吗?
【问题讨论】:
标签: linux multithreading file linux-kernel
是的,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 标志,并允许每个并发写入者仅修改文件自己的部分。【讨论】:
O_APPEND 可能会导致问题,如果 pos 参数不应该被忽略,例如,来自 pwrite() 调用。阅读“BUGS”部分:man7.org/linux/man-pages/man2/pread.2.html
vfs_write 的类似pwrite 用法的答案。