多进程文件处理

5
如果我的一个进程打开了一个文件,比如只读模式,操作系统是否保证在我读取时没有其他进程会写入该文件呢?这可能会导致读取进程得到旧文件版本的第一部分和新文件版本的第二部分,从而使数据完整性受到质疑。我不是在谈论没有寻址能力的管道,而是普通文件,具有寻址选项(至少在只有一个进程打开时)。
3个回答

3

不,当你读取文件时,其他进程可以更改文件内容。尝试运行"man fcntl"并忽略关于"advisory"锁定的部分;这些是"可选"锁定,只有进程想要才需要注意。相反,寻找(遗憾的是,非POSIX)的"mandatory"锁定。那些是保护你免受其他程序影响的锁定。尝试使用读取锁。


在我看来,强制锁定不是一个理想的功能 :) - MarkR
同意!更好的应用程序设计是可取的。但是,如果他必须保护一个他无法控制读者的文件,那么这些方法是唯一可行的。 - Brandon Rhodes

2

不,如果您打开一个文件,其他进程可以写入它,除非您使用锁定。

在Linux上,您可以使用以下命令在文件上添加咨询锁:

#include <sys/file.h>

...

flock(file_descriptor,LOCK_EX); // apply an advisory exclusive lock

2
除非编写应用程序也同意使用它们,否则咨询锁定是没有用处的。 - Brandon Rhodes
如果您确信每个相关方都在遵守,那么咨询锁就足够了。此外,如果一个进程在等待释放锁时被阻塞,要注意潜在的死锁问题。 - jiggy
2
强制锁并非总是可行的。例如,你可能需要使用“-o mand”在挂载时更改文件上的某些标志。 - Zifre

2
任何可以打开文件进行写操作的进程,都可以向其写入数据。这些写入操作可能与您自己的写入操作并发进行,从而导致(潜在地)不确定的状态。
作为应用程序编写者,您有责任确保不会发生意外情况。我认为强制锁定不是一个好主意。
更好的做法是不授予那些您不想让它们向文件中写入内容的进程写入权限。
如果多个进程打开同一个文件,则它们将拥有独立的文件指针,因此它们可以使用seek()方法而不会相互影响。
如果一个文件被一个线程化的程序(或一个共享其文件描述符的任务)打开,则文件指针也将被共享,因此您需要使用另一种方法来访问该文件以避免竞争条件造成混乱-通常是pread、pwrite或散布/收集函数readv和writev。

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