Я пытаюсь реализовать очень простую связь между сайтом PHP и программой на C ++.
Выбранное решение состояло в том, чтобы использовать Linux fifo.
Это хорошо работает для первой команды, но когда мы пытаемся открыть файл заново, возвращается ошибка.
См. Код ниже для получения дополнительной информации о сообщениях об ошибках.
Приложение C ++:
string path = "/tmp/cmd.fifo";
__mode_t priv = 0666;
int fifo;
mkfifo(path.c_str(), priv); // returns 0, but privileges are not applied
chmod(path.c_str(), priv); // returns 0 as well, and now privileges are working
fifo = open(path, O_RDONLY); // blocks the thread
PHP:
$fifoPath = "/tmp/cmd.fifo";
$fifo = fopen($fifoPath, 'w');
fwrite($fifo, "COMMAND");
fclose($fifo);
Приложение C ++:
// thread is unblocked. fifo==16
char in[20];
ssize_t r = read(fifo, in, sizeof(in)); // r == 7, in == "COMMAND"// process the command. And read again:
ssize_t r = read(fifo, in, sizeof(in)); // r = 0, so EOF
// Let's reopen it so we can wait for the next command.
// tried using close() here, no success though.
open(path.c_str(), O_RDONLY); // returns -1! strerror(errno) == "No such file or directory"mkfifo(path.c_str(), priv); // returns -1! strerror(errno) == "File exists"
В чем может быть проблема с кодом выше? Сообщения «Нет такого файла или каталога» и «Файл существует» довольно противоречивы.
Кстати, я открыт для другого вида решения для этого общения, например, решение C ++ или что-то с использованием библиотек повышения.
Задача ещё не решена.
Других решений пока нет …