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 规范,并没有发现关于这个案例的任何信息。

4

2 回答 2

7

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

您必须使用自己的互斥锁来保护您的文件。

于 2013-01-30T09:22:16.510 回答
4

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

The kernel won't crash if you access the same file from two different processes/threads, but it may overwrite or corrupt the file position and file data in an undefined way.

于 2013-01-30T09:46:11.213 回答