管道没有这样的文件或目录

时间:2015-04-11 10:45:53

标签: python c++ ipc named-pipes fifo

我正在尝试使用C ++创建一个命名管道并在python上读取它。这是我的代码:

const int MAX_BUF = 1024;
string wr_string = "Hi.";
char text[MAX_BUF] = "";
strcpy(text, wr_string.c_str());
int fd = open("/tmp/test", O_WRONLY);   // Open the pipe
write(fd,text,MAX_BUF);              // Write
close(fd);                                  // Close the pipe - allow the read

我正是这样读的:

import os
import time

pipe = open("/tmp/OKC_avgprice", "r")
line = pipe.read() 
pipe.close()   

print line

但是,每当我尝试阅读时,这就是我得到的:

Traceback (most recent call last):
  File "ipc.py", line 4, in <module>
    pipe = open("/tmp/test", "r")
IOError: [Errno 2] No such file or directory: '/tmp/test'

写入管道时应自动创建没有?那为什么没找到?

谢谢!

1 个答案:

答案 0 :(得分:1)

您的C ++代码未创建命名管道;您必须首先使用mkfifo(3)创建命名管道:

mkfifo("/tmp/test", 0600) // 0600 means writable and readable by owner only

这样的fifo将在ls -laF(GNU)上显示为

prw-------  1 user  group     0 Apr 12 07:02 test|

值得注意的是,该行将以p开头,名称后面会有|。 管道将保留在磁盘上(尽管/tmp通常在重新启动时清空)。


请注意,如果您尝试使用O_WRONLY打开文件,但文件不存在,则open将失败并显示ENOENT,并返回{ {1}} -1fd永远不会尝试创建仅包含open的新文件;创建一个新的常规文件,您需要调用

O_WRONLY

其中0600是文件的所需模式/权限。

open("/tmp/test", O_WRONLY|O_CREAT, 0600); 拨打writeclose-1将失败。 请理解必须始终检查所有系统调用的返回值。有时在Stackoverflow示例中,为简洁起见省略它们,应该是一般需要添加检查的常识。


要编写C ++ EBADF的内容,请直接从string写一下:

.c_str()

还要经常检查C函数的错误代码; write(fd, wr_string.c_str(), wr_string.length()); mkfifoopen可能会失败,并返回值write,您需要准备好处理这些案例。