竞争条件如何影响读取和写入(同时发生)

竞争条件如何影响读取和写入(同时发生)

假设我打开一个文件a进行读取。如果一个应用程序(我们称之为它)aWriter以随机间隔写入该文件会怎样?如果我尝试a打开并读取,是否有可能收到不正确的文件内容?同时 aWriter正在写新行。该文件会发生什么以及我从读取中得到的内容会发生什么。

另一种情况。假设我有一个b包含 100 行文本的文件。我还有一个随机bWriter写入的应用程序。b我想删除文件的前 80 行b。假设bWriter我想写入,b因为我打开了它,它仍然能够写入吗?它会放弃并丢失它的写入吗?

我问这个问题是因为我正在编写一个与 Syslog 相关的 Perl 脚本。我已指示 Syslog 将所有日志写入文件,我的脚本需要(每 5 分钟)读取文件的内容,执行其他一些操作,然后删除该文件中的所有行并将旧行写入存档。我使用该文件作为我的脚本和日志的最终存放位置之间的中间步骤。

谁能给我一些关于它到底是如何工作的见解?

答案1

两个进程可以打开相同的文件句柄进行写入。就像任何事情一样,最后执行的人获胜。

当一个进程打开一个文件句柄时,其他进程会向其中写入 80 行,第一个进程的内存缓冲区将不会有这 80 行。如果随后将缓冲区写入文件句柄,则文件的内容将只是第二个内存缓冲区中的内容。

现在,话虽这么说,现在很多程序都会检测到自上次打开以来原始文件内容发生了变化。有些会拒绝写入,有些会提示您重新加载缓冲区。有些人可能会做其他事情。每个程序都有责任确保它做正确的事情。内核/文件系统并不关心,并且它知道缺少 80 行的内存缓冲区是正确的复制。

现在,如果它是更重要的东西,比如数据库,而不仅仅是主目录中的一些文本文件或文档,那么更有可能使用文件锁定(这也不是说vimgedit不使用锁)。数据库可能也有自己的内部锁定机制。

UNIX 风格平台上的一般理念是在文件句柄写入方面进行协作。锁定不是一种安全控制机制(这就是权限/ACL 的用途),而是一种数据完整性机制。两个想要写入数据的程序通常希望确保数据写入正确,因此尊重彼此的锁对双方都有好处。内核/文件系统会警告有关锁定的信息,但仍然让每个进程执行它认为最好的操作。但是,Linux 确实支持强制执行锁定作为安装选项(这可能还需要文件系统支持,但我对此不确定)。

您可以阅读有关锁的更多信息维基百科的文件锁定文章。

相关内容