2

这是我想用 bash 表达的内容:

while true; do
  while read $line; do
    echo "Heard: $line"
  done < fifo
done

这里,fifo 是命名管道的路径。这将从fifo读取,但如果fifo为空,它将阻塞,直到其中有东西。

在 PHP 中尝试类似的事情会导致繁忙循环,因为 fgets 在管道中没有任何内容时返回。

4

3 回答 3

1

添加

sleep(1);

以避免大量 CPU 使用。这只是避免繁忙循环的最简单方法。您还可以查看stream_select(),它允许指定超时脚本应等待可读(或可写)流的时间。或者,您可以尝试使用stream_set_blocking()更改特定流的fgets()的默认行为。我不确切知道(我自己没有尝试过),但似乎最后一个就是你要找的那个。

stream_set_blocking($stream, 1);
$r = fgets($stream);
于 2010-11-29T23:56:27.807 回答
1

我相信fread正在阻塞。

于 2010-11-30T02:39:59.497 回答
0

fopen() 是你阻塞的地方;不在 fgets() 上。我的问题是我 fopen()ed 文件然后开始了我的循环,所以一旦管道被写入一次,繁忙的循环就会开始。相反,将 fopen() 放入循环中会使其阻塞,直到有写入器。

于 2010-12-05T20:52:14.287 回答