如何通过execve将终端命令输出重定向到C++中的std::string
how to redirect terminal command output via execve to std::string in c++
我想将在终端中执行命令的输出重定向到 C++ 中的字符串。我根本不希望命令输出出现在终端中,因为我使用的是 ncurses 显示器。
我有什么办法可以做到这一点吗?
我正在使用 Linux 终端。
我考虑过重定向到临时文件然后读取文件的内容。但我宁愿不介绍 tmp 文件。
澄清一下,我希望能够做到以下几点:
- 回显 "hello world" 通过 execve
- 将终端的输出重定向到 std::string,这样它实际上不会在这个阶段显示在终端中。
- 使用 ncurses 中的 printw 函数将命令输出打印到 ncurses window
我目前正在寻找使用来自 termios.h 和可能的 dup2
的功能的可能实现
我的代码如下所示:
std::string containerForOutput;
// some method which redicects execve into containerForOutput here
char cmd[100];
strcpy(cmd, "/usr/bin/");
strcat(cmd, argv[0]);
// execute the command using execve, but
// will not output to terminal after command is given
// and will instead store it in the string containerForOutput
int result = execve(cmd, argv, environ);
perror("Fallback Shell");
使用字符串流无效。
一个好的替代方法是使用 pstream 头文件而不是 execve,这会创建一个子进程。
多亏了这个post:
我捕获输出并使用 ncurses printw 方法打印它,而不是使用 exec:
// run a process and create a streambuf that reads its stdout and stderr
redi::ipstream proc("echo hello", redi::pstreams::pstdout | redi::pstreams::pstderr);
std::string line;
// read child's stdout
while (std::getline(proc.out(), line)) {
// the output is captured line by line here
// so that i can do what i want with it
printw(line.c_str());
printw("\n");
}
// if reading stdout stopped at EOF then reset the state:
if (proc.eof() && proc.fail()) {
proc.clear();
}
// read child's stderr
while (std::getline(proc.err(), line)) {
// error message is captured line by line here
// so that i can do what i want with it.
printw(line.c_str());
printw("\n");
}
pstream 在这里:
http://pstreams.sourceforge.net/
我想将在终端中执行命令的输出重定向到 C++ 中的字符串。我根本不希望命令输出出现在终端中,因为我使用的是 ncurses 显示器。 我有什么办法可以做到这一点吗?
我正在使用 Linux 终端。
我考虑过重定向到临时文件然后读取文件的内容。但我宁愿不介绍 tmp 文件。 澄清一下,我希望能够做到以下几点:
- 回显 "hello world" 通过 execve
- 将终端的输出重定向到 std::string,这样它实际上不会在这个阶段显示在终端中。
- 使用 ncurses 中的 printw 函数将命令输出打印到 ncurses window
我目前正在寻找使用来自 termios.h 和可能的 dup2
的功能的可能实现我的代码如下所示:
std::string containerForOutput;
// some method which redicects execve into containerForOutput here
char cmd[100];
strcpy(cmd, "/usr/bin/");
strcat(cmd, argv[0]);
// execute the command using execve, but
// will not output to terminal after command is given
// and will instead store it in the string containerForOutput
int result = execve(cmd, argv, environ);
perror("Fallback Shell");
使用字符串流无效。
一个好的替代方法是使用 pstream 头文件而不是 execve,这会创建一个子进程。
多亏了这个post:
我捕获输出并使用 ncurses printw 方法打印它,而不是使用 exec:
// run a process and create a streambuf that reads its stdout and stderr
redi::ipstream proc("echo hello", redi::pstreams::pstdout | redi::pstreams::pstderr);
std::string line;
// read child's stdout
while (std::getline(proc.out(), line)) {
// the output is captured line by line here
// so that i can do what i want with it
printw(line.c_str());
printw("\n");
}
// if reading stdout stopped at EOF then reset the state:
if (proc.eof() && proc.fail()) {
proc.clear();
}
// read child's stderr
while (std::getline(proc.err(), line)) {
// error message is captured line by line here
// so that i can do what i want with it.
printw(line.c_str());
printw("\n");
}
pstream 在这里: http://pstreams.sourceforge.net/