使用php在linux中写入管道

使用php在linux中写入管道,php,c,linux,named-pipes,Php,C,Linux,Named Pipes,我已经在linuxmkfifo/tmp/myFIFO中创建了一个管道,现在我已经将chmod设置为777。。然后我有一个c应用程序,它读取管道并将我写的内容输出到管道 当我在php中这样做的时候,它就工作了 $command = "echo 'helloworld' > myFIFO"; $process = proc_open($command, $descriptor, $pipes, $cwd, $env); 但是当我用fwrite做的时候,例如 $out = fopen("/tm

我已经在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?中没有从管道中获得任何输出?。。为什么写的不好?。。感谢

FIFO有一种奇怪的行为,即当您第一次
打开
进行写入时(直接使用
open(2)
系统调用或通过任何包装,如
fopen(3)
),打开调用会阻塞,直到读卡器也打开相同的FIFO进行读取。当两端都已打开时,两个呼叫将被解锁,并且可以开始读写


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

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

chmod a+rw /tmp/myFIFO
现在一切都好了


谢谢您的帮助。

您检查过fopen是否成功了吗?失败时返回布尔值false。e、 g.
$out=fopen(…)或die('无法打开文件')要追加而不是截断?还没等,我要试试那个。我会尽快给你更新。你确定你的路径/工作目录正确吗?您的
fopen()
代码使用绝对路径,但您的
proc\u open()
示例使用相对路径。我无法打开文件。。为什么?。。我将chmod设置为777,但为什么我不能打开它?顺便问一下,a+rw的数值等价物是什么?@demic0de
chmod 777
chmod a+rw
777
a+rw
不同。通常,符号模式没有数字等价物,因为符号模式可以忽略某些位(例如,
a+r
不影响现有的写入或执行位),因此,对于任何给定的文件,生成的数字取决于原始数字。)
777
通常与
a+rwx
相同,因为您同时设置所有读/写/执行(但请注意,除了这些模式位之外,还有其他模式位)。@demoic0de:mkfifo尊重umask,因此您应该执行
$old=umask();乌马斯克(0);mkfifo(FIFO,0777);乌马斯克(旧)@Jeffiekins:这是一个有趣的问题,据我所知,这个问题没有什么意义。我做了一个实验:
mkfifo-fifo;chmoda+x/fifo
,令我惊讶的是,Bash毫无错误地打开了读取端。我给它写了一个小shell脚本
echo-e'#/来自另一个shell的bin/bash\necho hi>fifo
,此时第一个shell死于
错误的解释器:权限被拒绝
。我在这里推测,当它试图执行FIFO时,它可能试图
mmap()
将文件放入内存,这可能是权限拒绝错误的来源。