我正在尝试使用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'
写入管道时应自动创建没有?那为什么没找到?
谢谢!
答案 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}} -1
。 fd
永远不会尝试创建仅包含open
的新文件;创建一个新的常规文件,您需要调用
O_WRONLY
其中0600是文件的所需模式/权限。
随open("/tmp/test", O_WRONLY|O_CREAT, 0600);
拨打write
和close
,-1
将失败。 请理解必须始终检查所有系统调用的返回值。有时在Stackoverflow示例中,为简洁起见省略它们,应该是一般需要添加检查的常识。
要编写C ++ EBADF
的内容,请直接从string
写一下:
.c_str()
还要经常检查C函数的错误代码; write(fd, wr_string.c_str(), wr_string.length());
,mkfifo
,open
可能会失败,并返回值write
,您需要准备好处理这些案例。