заблокировать файл между C и php - PullRequest
1 голос
/ 25 января 2011

Хотя в заголовке упоминается файл, он не обязательно должен быть файлом. Подойдет любой механизм блокировки.

Вот ситуация: у меня есть процесс-демон, написанный на C, и веб-страница на php. Я хотел бы иметь способ взаимной блокировки, чтобы при определенной ситуации демон C заблокировал файл, а php обнаружил ситуацию и сообщил клиентской стороне, что система занята.

Есть ли простой способ сделать это?

Спасибо

Ответы [ 4 ]

3 голосов
/ 25 января 2011

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 one

2 голосов
/ 25 января 2011

Вы можете заставить своего демона создать файл, когда он занят, и удалить его, когда нет, тогда в PHP сделайте что-то вроде:

if (file_exists('/path/to/file')) {
    echo 'System busy';
}
1 голос
/ 26 января 2011

Вы хотите, чтобы PHP только обнаруживал, что демон занят?Или вы действительно хотите, чтобы они подождали друг друга?Использование эксклюзивной блокировки будет иметь обратную сторону: демон C должен будет дождаться, пока все экземпляры PHP завершат свою работу, прежде чем он сможет захватить свою блокировку и продолжить работу.что демон C занят (т. е. только в одном направлении), лучшим вариантом может быть просто проверка на наличие занятого файла токенов (или семафора, или объекта совместно используемой памяти - зависит от платформы).Однако создание файлов обходится дороже, чем просто установка простого флага в общей памяти.

1 голос
/ 25 января 2011

Если ваше PHP-приложение управляется базой данных, должно быть легко обновить определенный столбец этой базы данных, чтобы указать «система занята».

Ваш cronjob установит и сбросит этот флаг и ваше PHP-приложениеможет прочитать его значение.

...