【问题标题】:Pipe no such file or directory管道没有这样的文件或目录
【发布时间】:2015-04-11 10:45:52
【问题描述】:

我正在尝试使用 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'

写管道的时候应该是自动创建的吧?那为什么找不到呢?

谢谢!

【问题讨论】:

  • 您的错误和您给我们的代码不同。你能检查一下一切都和你运行的完全一样吗,否则很难解决问题。
  • 那不是真正的管道,它只是一个普通的文件。
  • 您在 C 中使用mkfifo(3) 创建了一个命名管道或 fifo。此外,您的 C"++" 代码正在向管道打印垃圾。
  • 至于你的问题,你确实需要检查C++代码中的错误。 open 调用真的成功了吗?
  • @Lattyware 实际上不是...

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


【解决方案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 作为@987654332 @。 open 永远不会尝试仅使用 O_WRONLY 创建新文件;创建一个新的常规文件,你需要调用

open("/tmp/test", O_WRONLY|O_CREAT, 0600);

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

使用-1 调用writeclose 随后将失败并使用EBADF请理解您必须始终检查所有系统调用的返回值。有时在 Stackoverflow 示例中,为了简洁起见,它们被省略了,这应该是常识,需要添加检查。


要写入 C++ string 的内容,直接从 .c_str() 写入:

write(fd, wr_string.c_str(), wr_string.length());

还要经常检查 C 函数的错误代码; mkfifoopenwrite 可能会失败,它们会返回值&lt; 0,您需要做好处理这些情况的准备。

【讨论】:

  • 有趣。我是否需要每次都使用 mkfifo 创建一个命名管道(即使在 python 中也是如此)?我以为只要写它就会自动创建?
猜你喜欢
  • 2021-06-24
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2016-05-06
相关资源
最近更新 更多