【发布时间】:2021-01-08 00:12:24
【问题描述】:
我正在围绕一个复杂的二进制文件编写一个小包装器(在 PHP 7.0.33 中),该二进制文件从一个命名文件中获取其输入。由于这将处理机密,我不想将数据提交到文件系统,因此使用 FIFO 而不是传统文件。二进制文件将愉快地从 FIFO 中读取其数据(使用 2 个 shell 会话进行测试——其中一个是我创建了 fifo 并启动了二进制文件,第二个是我将一个文件放入了 fifo)。
但是在 PHP 中,对 fopen() 的调用会阻塞,无论我指定 w、a 还是 c
if (posix_mkfifo("myfifo", 0600)) {
$writer=fopen("myfifo", 'w'); // this blocks
`binary myfifo`;
fputs($writer, $mydata);
}
虽然我希望写入会阻塞,如果没有读取数据,我没想到 fopen() 会阻塞。
它似乎确实可以使用“w+”工作(执行继续,并且二进制文件已启动)但是二进制文件失败了
QIODevice::read (QFile, "filename"): device not open
为了进一步调查,我为二进制文件编写了一个简单的替换。当我将文件放入 FIFO 时,这同样有效:
$in='';
$fh=fopen($argv[1],'r');
if (is_resource($fh)) {
print "File opened\n";
while (!feof($fh)) {
$in.=fgets($fh);
}
} else {
print "failed to open file\n";
}
file_put_contents("output", $in);
但是当我从 PHP 代码写入 FIFO 时......
fopen(import): failed to open stream: No such file or directory in ...
【问题讨论】:
-
FIFO 将阻塞直到至少有一个读写器。 open 不会被
w+阻塞的原因是因为你有一个读者和一个作者(相同的过程)。除此之外,我真的不明白你剩下的问题是什么。 -
这当然是我上面所描述的——我的意思是在没有写入的情况下是否应该这样做。