并发访问文件linux

时间:2013-01-30 09:20:19

标签: c linux multithreading concurrency filesystems

我正在研究如何在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规范,但没有发现这个案例。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

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