1

虽然标题提到了文件,但它不一定是文件。任何锁定机制都可以。

情况如下:我有一个用 C 编写的守护进程,以及一个用 php 编写的网页。我想有一种相互锁定的方法,这样在某些情况下,C 守护进程会锁定一个文件,php 检测到这种情况并告诉客户端系统很忙。

有没有一种简单的方法可以做到这一点?

谢谢,

4

4 回答 4

3

flock做得好。

在您的 PHP 脚本中,使用非阻塞锁

$fd = fopen('/var/run/lock.file', 'r+');
if (!flock($fd, LOCK_SH | LOCK_NB, $wouldblock) && $wouldblock) {
    // buzy
}

LOCK_NB 标志使此调用非阻塞。如果文件被独占锁定,它将立即返回。将允许多个页面同时锁定文件。

您可以使用

flock($fd, LOCK_UN);

在您的 C 守护程序中,使用阻塞和排他锁:

flock(fd, LOCK_EX); // This will wait until no page has locked the file

请参阅 PHP 的flock()文档和 C 的文档

于 2011-01-25T16:48:13.337 回答
2

您可以让您的守护进程在忙碌时创建一个文件,并在不忙时将其删除,然后在 PHP 中执行以下操作:

if (file_exists('/path/to/file')) {
    echo 'System busy';
}
于 2011-01-25T16:46:27.680 回答
1

如果您的 PHP 应用程序是数据库驱动的,那么更新该数据库的某个列以指示“系统繁忙”应该很容易。

您的 cronjob 将设置和重置此标志,您的 PHP 应用程序可以读取它的值。

于 2011-01-25T16:43:39.870 回答
1

您是否只想让 PHP 检测到守护程序正忙?还是您真的希望他们互相等待?使用独占锁的缺点是 C 守护进程必须等待所有 PHP 实例完成其工作,然后才能获取其锁并继续运行。

如果您只是想检测 C 守护程序是否繁忙(即,仅在一个方向上),那么仅测试是否存在繁忙的令牌文件(或信号量,或共享内存对象 - 取决于平台)可能是一个更好的选择. 然而,创建文件往往比在共享内存中设置一个简单的标志更昂贵。

于 2011-01-25T23:30:29.273 回答