【问题标题】:Is php's fopen incompatible with the POSIX open for pipesphp 的 fopen 是否与 POSIX 开放管道不兼容
【发布时间】:2010-11-01 18:26:31
【问题描述】:

为什么会如此令人困惑。 PHP 的 fopen 不会打开文件进行读取,除非管道中有数据等待读取(根据this 注释)。 C 的 open 的 POSIX 规范指出,根据 O_NONBLOCK 标志的状态,当打开管道进行写入时,如果没有进程打开文件进行读取,open 将阻塞调用进程或返回错误。这种差异可以调和吗?

【问题讨论】:

  • 对于这种情况,其他地方的人建议调用 bash 脚本将无用的数据写入管道,一旦打开完成就可以丢弃这些数据。我目前有 php 打开和关闭一个 C 线程来执行此读取,但由于读取处于循环中,每秒运行一次左右,我想尝试以正确的方式执行此操作,而不执行任何非常昂贵的操作就像线程创建一样。
  • this comment 有帮助吗? (本质上,做一个fopenr+ 所以你也是一个作家......)
  • 不幸的是,我仍然无法让它工作。打开文件后,我使用 stream_select 循环,直到收集到所有输入。我认为流选择可能永远不会返回,因为总是有一个作家对流句柄有一个打开的句柄,但是张贴者说他的流选择正常工作。我的流选择已决定从不进入其循环。 while(($ss = stream_select($r, $w = null, $e = null, 0, 5000)) !=0){read...}
  • 实际上我通过更彻底的测试发现r+方法根本不起作用。

标签: php posix pipe fopen


【解决方案1】:

没有。 Php 应该向 C 发出信号,表明它正在等待连接,然后阻止输入。 C 应该在 open 调用返回 -1 和 errno == 6 时循环,然后 fdopen 描述符。享受吧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多