温馨提示×

c++ exec输出如何过滤

c++
小樊
81
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