Я создаю процесс в python, используя подпроцесс, и хочу читать выходные данные из программы, используя каналы. Программа на C++, похоже, не закрывает трубу, даже когда явное указание закрыть ее.Трубы между 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;
}
Я призываю эту небольшую программу с этим питоном сниппета: метод
import os
import subprocess
read, write = os.pipe()
proc = subprocess.Popen(["./dummy", str(write)])
data = os.fdopen(read, "r").read()
print data
Считанные() не возвращает, как ФД не закрыты. Проблема с открытием и закрытием записи fd в python решает проблему. Но мне кажется, что это взломан. Есть ли способ закрыть fd в моем C++-процессе?
Большое спасибо!
Интересно. Значит, вы закрываете дескриптор файла после создания объекта «Popen»? – krlmlr
@ user946850: см. Примерный код на http://linux.die.net/man/2/pipe –
См. Также пример в документах Python: http://docs.python.org/library/subprocess.html. # replace-shell-pipe. «Вызов p1.stdout.close() после запуска p2 важен для того, чтобы p1 получил SIGPIPE, если p2 выходит до p1». Это означает, что да, пожалуйста, закройте дескриптор процесса Python. – krlmlr