【问题标题】:Writing to a pipe in linux using php使用 php 在 linux 中写入管道
【发布时间】:2012-10-29 15:23:42
【问题描述】:

我在 linux mkfifo /tmp/myFIFO 中创建了一个管道,现在我将 chmod 设置为 777.. 然后我有一个 c 应用程序,它读取管道并将我写的内容输出到管道。

当我在 php 中这样做时,它可以工作..

$command = "echo 'helloworld' > myFIFO";
$process = proc_open($command, $descriptor, $pipes, $cwd, $env);

但是当我用 fwrite 来做时,例如

$out = fopen("/tmp/myFIFO","w");
fwrite($out,"hello");
fclose($out);

它根本不起作用。我在 linux 中的管道没有得到任何输出?.. 为什么 fwrite 不起作用?.. 谢谢

【问题讨论】:

  • 你检查fopen是否成功了吗?它在失败时返回布尔值 false。例如$out = fopen(...) or die('unable to open file');.
  • 你试过$out = fopen("/tmp/myFIFO","a"); 追加而不是截断吗?
  • 等不及要试一试了。我会尽快更新你。
  • 你确定你的路径/工作目录是正确的吗?您的 fopen() 代码使用绝对路径,但您的 proc_open() 示例使用相对路径。
  • 我无法打开文件..这是为什么?..我将 chmod 设置为 777 但为什么我无法打开它?

标签: php c linux named-pipes


【解决方案1】:

现在可以正常工作了,感谢您的帮助。我将 chmod 设置为 a+rw。

chmod a+rw /tmp/myFIFO

现在一切正常。

感谢您的所有帮助。

【讨论】:

    【解决方案2】:

    FIFO 有一个奇怪的行为,当您第一次将它们 open 写入时(直接使用 open(2) 系统调用或通过任何包装器,例如 fopen(3)),open 调用会阻塞,直到读取器也打开相同的 FIFO 用于读取。当两端都打开后,两个调用就被解除阻塞,可以开始读写了。

    您可能看到的是您的程序永远不会到达fwrite 调用(应该正常运行),因为fopen 调用永远不会返回,因为还没有读取器打开 FIFO 的另一端。如果您有另一个程序打开 FIFO 进行读取,它应该可以工作。

    【讨论】:

    • 顺便说一句,a+rw 的数值等价物是多少?
    • @demic0de chmod 777 与chmod a+rw 相同
    • 777 与 a+rw 不同。一般来说,符号模式没有数字等价物,因为符号模式可以忽略某些位(例如,a+r 不会影响现有的写入或执行位),因此对于任何给定文件,结果数取决于原始数。)@ 987654332@ 将 通常与a+rwx 相同,因为您将所有读/写/执行设置在一起(但请注意,除了这些之外还有其他模式位)。
    • @demoic0de: mkfifo 尊重 umask,所以你应该这样做 $old = umask(); umask(0); mkfifo(FIFO, 0777); umask($old);
    • @Jeffiekins:这是一个有趣的问题——据我所知,没有任何有意义的用法。我做了一个实验:mkfifo fifo; chmod a+x; ./fifo,令我惊讶的是,Bash 毫无错误地打开了读取端。我从另一个 shell 写了一个小 shell 脚本 echo -e '#!/bin/bash\necho hi > fifo,此时第一个 shell 以 bad interpreter: Permission denied 死掉了。我在这里推测,当它尝试执行 FIFO 时,它可能已经尝试将 mmap() 文件放入内存,这很可能是权限被拒绝错误的来源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多