файл блокировки между C и php

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

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

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

Благодаря,

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 

См. Документацию flock() PHP и один C

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

 if (file_exists('/path/to/file')) { echo 'System busy'; } 

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

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

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

Если вы только хотите обнаружить, что демона C занята (т. Е. Только в одном направлении), просто проверка на наличие загруженного файла токена (или семафора или объекта с общей памятью – зависит от платформы) может быть лучшим вариантом , Создание файлов имеет тенденцию быть дороже, чем просто установить простой флаг в общей памяти.