我正在努力实现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 ++解决方案或使用boost库的东西。