温馨提示×

c++ exec输出如何过滤

c++
小樊
119
2024-12-01 15:38:16
栏目: 编程语言

在C++中,如果你想使用exec函数执行外部命令并过滤其输出,你可以将命令的输出重定向到一个管道,然后使用C++的I/O流来读取和处理这个管道的内容。以下是一个示例代码,展示了如何使用exec函数执行一个命令并过滤其输出:

#include <iostream> #include <sstream> #include <string> #include <vector> #include <unistd.h> #include <sys/wait.h> int main() { std::string command = "ls -l"; // 示例命令:列出当前目录的文件 std::vector<std::string> args = {"ls", "-l"}; // 将命令分解为参数向量 // 创建一个管道 int pipefds[2]; if (pipe(pipefds) == -1) { perror("pipe"); return 1; } // 使用fork创建子进程 pid_t pid = fork(); if (pid == -1) { perror("fork"); close(pipefds[0]); close(pipefds[1]); return 1; } else if (pid == 0) { // 子进程 // 将子进程的标准输入重定向到管道的读取端 dup2(pipefds[0], STDIN_FILENO); // 关闭不需要的管道文件描述符 close(pipefds[0]); close(pipefds[1]); // 执行命令 execvp(args[0].c_str(), args.data()); // 如果execvp返回,则表示执行失败 perror("execvp"); return 1; } else { // 父进程 // 将子进程的标准输出重定向到管道的写入端 dup2(pipefds[1], STDOUT_FILENO); // 关闭不需要的管道文件描述符 close(pipefds[0]); close(pipefds[1]); // 等待子进程结束 int status; waitpid(pid, &status, 0); // 读取子进程的输出并过滤 std::string line; while (std::getline(std::cin, line)) { // 在这里添加过滤逻辑 if (line.find("d") != std::string::npos) { // 示例过滤:只显示目录 std::cout << line << std::endl; } } } return 0; } 

在这个示例中,我们使用pipe创建了一个管道,然后使用fork创建了子进程。子进程将执行命令,并将标准输出重定向到管道的写入端。父进程将子进程的标准输出重定向到自己的标准输出,并读取过滤后的输出。你可以根据需要修改过滤逻辑。

0