当 PHP、C++ 和 shell 脚本尝试访问同一个文件时,如何避免错误?

How can I avoid errors when PHP, C++ and shell script try to access the same file?

本文关键字:文件 同一个 错误 何避免 访问 C++ PHP shell 脚本      更新时间:2023-10-16

PHP,C++和bash脚本中是否有方法可以使相应的程序在访问文件时等待轮到它?

我有一个用PHP编写的网页,它使用户能够输入6个值:

URL
URL Refresh Interval
Brightness
Color1 in hex
Color2 in hex
Color3 in hex

这些值将以configuration.txt写入。

每次访问网页configuration.txt打开网页时,PHP 都会从那里获取一些值,然后关闭它。 当提交上述一个或多个值时,也会打开configuration.txt,然后关闭。

接下来,我有一个 bash 定期从configuration.txtwgetsURL 并将输出写入另一个文件,称为url_response.txt.

while [ 0 ]
do
line=$(head -n 1 data/configuration.txt)
wget -q -i $line -O url_response.txt
sleep 2
done

此脚本将放入C++程序中。

最后,同一个C++程序必须访问url_response.txt才能从中获取和解析一些字符串,并且还必须访问configuration.txt才能从中获取三种颜色。

我很确定这三个程序会在某一点相交,我不想知道那时会发生什么。

避免争用条件的常用方法是使用锁定文件。当程序尝试读取或写入configuration.txt时,它会首先检查锁定文件。

有两种类型的锁:

  • 共享锁
  • 独占锁

只要没有其他程序具有独占锁,程序就可以获得共享锁(读锁定(。这用于读取文件。只要没有其他程序写入文件,多个程序就可以读取该文件。

仅当没有其他程序具有锁(既不是独占锁也不是共享锁(时,程序才能获得独占锁(写锁(。这用于写入文件。只要程序正在读取或写入文件,就不允许其他程序写入。

在 Linux 系统上,您可以使用flock来管理文件锁定。

读:

flock --shared lockfile -c read.sh

flock --exclusive lockfile -c write.sh

通常,此命令将等到锁可用。跟

羊群 --非阻止锁定文件

该命令将立即失败,而不是等待。

从手册页

概要

flock [options] <file|directory> <command> [command args]
flock [options] <file|directory> -c <command>
flock [options] <file descriptor number>

描述

这个工具从 shell 脚本或命令行中管理 flock(2( 锁。

第一种和第二种形式将锁包裹在执行命令周围,其方式类似于 su(1( 或 newgrp(1(。 它 锁定已创建的指定文件或目录 (假设具有适当的权限(,如果尚不存在。 默认情况下,如果无法立即获取锁,则蜂拥而至 等到锁可用。

第三种形式使用按文件描述符编号打开的文件。 请参阅如何使用它的示例。

这是 c++ 的手册页,这里是 shell 脚本的手册页。

所以你想避免你的一个读者在写入文件时获得文件的部分副本?

因此,避免此问题的常用方法是,当您写入文件时,将其写入同一文件夹中的不同名称。然后使用移动替换原始文件。

Unix将确保如果原始文件有任何现有的读取器,该文件将保留为隐藏文件,直到它们全部关闭。任何新读者都将看到新移动的文件。读者不应看到损坏的文件。

要通过修改文件来做同样的事情,您能做的最好的事情就是在文件中保留某种序列号。编写器应在写入之前更新序列,并在写入之后再次更新。任何读者都应该在阅读之前和之后阅读序列。如果串行更改,则读取无效,应重复。确保数据未缓存的问题也需要解决。这对于偶尔更新文件是可以的,但如果内容频繁更新,显然会损害读取器的性能。