Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C/C+中捕获syscall stdout而不写入文件+;_C++_C_System Calls - Fatal编程技术网

C++ 在C/C+中捕获syscall stdout而不写入文件+;

C++ 在C/C+中捕获syscall stdout而不写入文件+;,c++,c,system-calls,C++,C,System Calls,我想将系统调用的std输出读入C/C++字符串。我可以在不使用临时文件的情况下执行此操作吗 Perl C++ 可能会帮助您从系统调用重定向stdout。使用C(可能是最简单的解决方案,即使它不使用C++iostream): 假设您的iostream具有非标准的xfstream::xfstream(intfd)构造函数: FILE *p = popen("echo hello", "r"); std::ifstream p2(fileno(p)); std::string s; p2 >&g

我想将系统调用的std输出读入C/C++字符串。我可以在不使用临时文件的情况下执行此操作吗

Perl

C++

可能会帮助您从系统调用重定向stdout。

使用C(可能是最简单的解决方案,即使它不使用C++
iostream
):

假设您的
iostream
具有非标准的x
fstream::
x
fstream(intfd)
构造函数:

FILE *p = popen("echo hello", "r");
std::ifstream p2(fileno(p));
std::string s;
p2 >> s;
p2.close();
pclose(p);
使用,您不必依赖于对
iostream
的非标准扩展:

FILE *p = popen("echo hello", "r");
std::string s;
for (size_t count; (count = fread(buf, 1, sizeof(buf), p));)
    s += string(buf, buf + count);
pclose(p);
boost::iostreams::file_descriptor_source p2(fileno(p));
不幸的是,Windows非常糟糕,只适用于控制台应用程序;对于图形应用程序:

SECURITY_ATTRIBUTES sec;
sec.nLength = sizeof(sec);
sec.bInheritHandle = TRUE;
sec.lpSecurityDescriptor = NULL;
HANDLE *h[2];
CreatePipe(&h[0], &h[1], &sec, 0);
SetHandleInformation(h[0], HANDLE_FLAG_INHERIT, 0)
STARTUPINFO si;
memset((void *)&si, 0, sizeof(si));
si.hStdInput = INVALID_HANDLE_VALUE;
si.hStdOutput = h[1];
si.hStdError = INVALUD_HANDLE_VALUE;
si.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, "cmd /c \"echo hello\"", NULL, NULL, TRUE, 0, NULL, NULL, &si, NULL);
boost::iostreams::file_descriptor_source p(h[0]);

(完全未经测试)

这里的问题当然是“系统调用”与“系统()调用”不同。@alex vasi:谢谢你的链接,我搜索了一下,但在发布问题之前没有找到该页面。等等。。。在同一个流上调用p2.close()和pclose()。这意味着你试图关闭它两次。在我看来,一旦您将其传递给ifstream,您就失去了对该流的控制,并且无法再使用p。
boost::iostreams::file_descriptor_source p2(fileno(p));
SECURITY_ATTRIBUTES sec;
sec.nLength = sizeof(sec);
sec.bInheritHandle = TRUE;
sec.lpSecurityDescriptor = NULL;
HANDLE *h[2];
CreatePipe(&h[0], &h[1], &sec, 0);
SetHandleInformation(h[0], HANDLE_FLAG_INHERIT, 0)
STARTUPINFO si;
memset((void *)&si, 0, sizeof(si));
si.hStdInput = INVALID_HANDLE_VALUE;
si.hStdOutput = h[1];
si.hStdError = INVALUD_HANDLE_VALUE;
si.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, "cmd /c \"echo hello\"", NULL, NULL, TRUE, 0, NULL, NULL, &si, NULL);
boost::iostreams::file_descriptor_source p(h[0]);