Linux下文件的并发访问

10

我正在研究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规范,并没有找到与此案例有关的内容。


这是用户空间代码吗? - sr01853
@Sibrajas:read和write是系统调用,这意味着它们的实现在内核中。(除了vdso和vsyscalls之外,但不用担心) - Andrew Tomazos
也许这个强制锁定的链接会有用。http://kernel.org/doc/Documentation/filesystems/mandatory-locking.txt - sr01853
@user1131467 是的,我知道。我只是被这个文本误导了。第一行中的系统调用读/写是如何完成的。它可以被编辑为已实现。 - sr01853
1
可能是POSIX的read()和write()系统调用是原子操作吗?的重复问题。 - Hasturkun
2个回答

7

Linux在保护多线程写入文件时不使用任何锁定机制。

您需要使用自己的互斥锁来保护您的文件。


3
这是 POSIX 规范规定的方式吗?所有的 UNIX 内核都这样做吗? - Moka

4

在多线程应用程序中,您有责任对文件描述符进行串行化访问。在跨进程时,您可以使用flock(2)系统调用来同步访问同一文件。

如果您从两个不同的进程/线程访问同一文件,则内核不会崩溃,但可能以未定义的方式覆盖或损坏文件位置和文件数据。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接