我正在研究如何在Linux系统调用读/写,我发现这个:
.... loff_t pos = file_pos_read(f.file); ret = vfs_read(f.file, buf, count, &pos); file_pos_write(f.file, pos); fdput(f); ...`
我的问题是:
locking在哪里? 我会想像这样的东西:
.... lock(f.file); // <-- lock file struct loff_t pos = file_pos_read(f.file); ret = vfs_read(f.file, buf, count, &pos); file_pos_write(f.file, pos); fdput(f); unlock(f.file); // <-- unlock file struct ...
如果多个线程同时尝试读取/写入,它们可以在相同的偏移处读/写?
如果我的理解是正确的,那linux没有使用任何locking机制来保护偏移量,这是POSIX兼容吗?
我看了POSIX规范,并没有发现这种情况。
Linux不使用任何锁定机制来保护多线程写入文件。
你必须使用自己的互斥来保护你的文件。
在多线程应用程序中,您负责序列化对文件描述符的访问。 在整个进程中,您可以使用flock(2)
系统调用来同步对同一个文件的访问。
如果您从两个不同的进程/线程访问相同的文件,内核不会崩溃,但它可能会以未定义的方式覆盖或损坏文件位置和文件数据。