【问题标题】:linux kernel: is vfs_write thread safe?linux内核:vfs_write线程安全吗?
【发布时间】:2016-05-28 19:48:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: linux multithreading file linux-kernel


    【解决方案1】:

    是的,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 不会在并发写入者之间同步文件中的偏移量。并发写入器可能的有用使用场景包括:

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

    【讨论】:

    • O_APPEND 可能会导致问题,如果 pos 参数不应该被忽略,例如,来自 pwrite() 调用。阅读“BUGS”部分:man7.org/linux/man-pages/man2/pread.2.html
    • @AndrewHenle:感谢您的提示。我已经更新了我对vfs_write 的类似pwrite 用法的答案。
    猜你喜欢
    • 2010-12-20
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 2013-08-23
    相关资源
    最近更新 更多