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

n0p*_*0pe 5 filesystems io perl readline

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

另一个场景。假设我有一个b包含 100 行文本的文件。我还有一个随机bWriter写入的应用程序b。我想删除 file 的前 80 行b。让我们假设bWriter想在b我打开它时写信,它还能写吗?它会放弃并丢失它的写入吗?

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

谁能给我一些有关这究竟是如何工作的见解?

bah*_*mat 6

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

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

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

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

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

您可以在Wikipedia 的文件锁定文章中阅读有关锁的更多信息。