Python 和 C++ 之间的管道不会关闭
Pipes between Python and C++ don't get closed
我正在使用子进程在python中生成一个进程,并希望使用管道从程序中读取输出。不过,C++程序似乎并没有关闭管道,即使明确告诉它关闭管道也是如此。
#include <cstdlib>
#include <ext/stdio_filebuf.h>
#include <iostream>
int main(int argc, char **argv) {
int fd = atoi(argv[1]);
__gnu_cxx::stdio_filebuf<char> buffer(fd, std::ios::out);
std::ostream stream(&buffer);
stream << "Hello World" << std::endl;
buffer.close();
return 0;
}
我用这个python代码片段调用这个小程序:
import os
import subprocess
read, write = os.pipe()
proc = subprocess.Popen(["./dummy", str(write)])
data = os.fdopen(read, "r").read()
print data
read() 方法不返回,因为 fd 未关闭。在python中打开和关闭写fd可以解决这个问题。但这对我来说似乎是一个黑客。有没有办法在我的C++过程中关闭 fd?
多谢!
在 Linux 上生成一个子进程(实际上所有 POSIX 操作系统)通常通过 fork
和 exec
来完成。 fork
后,两个进程都会打开文件。 C++进程关闭它,但文件保持打开状态,直到父进程也关闭 fd。 这对于使用fork
的代码来说是正常的,通常由fork
周围的包装器处理。 阅读man
页面了解pipe
。 我想python无法知道哪些文件正在传输到子进程,因此不知道在父进程与子进程中要关闭什么。
POSIX 文件描述符是进程的本地描述符。Python 工具中的文件描述符
write
在C++过程中无效。
也许最简单的方法是让C++进程将其输出写入stdout
(如cout <<
),Python 使用 stdout=PIPE
调用Popen
并读取proc.stdout
(或使用 proc.communicate()
而不是使用 fdopen
)。这应该也适用于Windows。
有关将文件描述符作为命令行参数传递的信息,请参阅 Ben Voigt 的答案。
相关文章:
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- IPC使用多个管道和分支进程来运行Python程序
- 如何创建函数管道,以便函数一个接一个地运行?
- Gstreamer 管道从命令 lne 到 c 代码
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 将旧管道转换为现代 openGL 时出现问题
- 如何使用管道在父级和子级之间来回传递文件
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 如何测量管道延迟?
- 我如何使用此程序管道多个命令?C++
- 先进先出:一个进程永远不会从管道读取
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 使用模板而不是虚拟方法的管道模式
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- Opencv GStreamer管道在Raspberry Pi 4上不起作用
- 阻塞管道连接命名管道不触发
- GLib-ERROR:为GWakeup创建管道:打开的文件太多
- 向 vulkan 管道添加额外的 UBO 会停止所有几何体渲染
- 在命名管道中发送标准::字符串流