【发布时间】:2013-01-14 01:21:18
【问题描述】:
我正在研究如何在 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);
...`
我的问题是:
锁定去了哪里?我会想象这样的事情:
....
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没有使用任何锁定机制来保护偏移量,这是否符合POSIX?
我确实查看了 POSIX 规范,但没有发现任何关于此案例的信息。
【问题讨论】:
-
这是用户空间代码?
-
@Sibrajas:read 和 write 是系统调用,这意味着它们的实现在内核内部。 (除了 vdso 和 vsyscalls,但不用担心)
-
可能这个关于强制锁定的链接很有用。 kernel.org/doc/Documentation/filesystems/mandatory-locking.txt
-
@user1131467 是的。我知道。我只是被这段文字误导了。系统调用读/写是如何完成的(在第一行)。它可以在实施时进行编辑。
标签: c linux multithreading concurrency filesystems