0

我正在尝试实现 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 库的东西。

4

0 回答 0