legongju.com
我们一直在努力
2024-12-23 20:51 | 星期一

c++ exec输出如何过滤

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

#include 
#include 
#include 
#include 
#include 
#include 

int main() {
    std::string command = "ls -l"; // 示例命令:列出当前目录的文件
    std::vector 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创建了子进程。子进程将执行命令,并将标准输出重定向到管道的写入端。父进程将子进程的标准输出重定向到自己的标准输出,并读取过滤后的输出。你可以根据需要修改过滤逻辑。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/49639.html

相关推荐

  • c++ stod怎样防止报错

    c++ stod怎样防止报错

    在C++中,std::stod函数用于将字符串转换为浮点数。为了避免报错,你需要确保提供的字符串是一个有效的浮点数表示。以下是一些建议,可以帮助你防止std::stod报错...

  • c++ stod性能是否最优

    c++ stod性能是否最优

    std::stod 是 C++ 标准库中的一个函数,用于将字符串转换为双精度浮点数。关于其性能是否最优,这取决于具体的使用场景和需求。以下是关于 std::stod 性能的相关...

  • c++ stod和std::to_string咋样

    c++ stod和std::to_string咋样

    std::stod 和 std::to_string 是 C++ 标准库中的两种函数,它们用于将不同类型的数据转换为字符串。 std::stod:这个函数用于将一个字符串转换为浮点数(double)...

  • c++ stod对编码有要求吗

    c++ stod对编码有要求吗

    std::stod 是 C++ 标准库中的一个函数,用于将字符串转换为 double 类型的浮点数。关于编码,std::stod 函数本身并不直接处理编码问题,因为它主要处理的是字符串...

  • c++ exec能处理多线程吗

    c++ exec能处理多线程吗

    C++ 的 exec 函数本身并不能直接处理多线程。exec 系列函数(如 execl, execv, execle, execvp 等)用于在当前进程的上下文中替换一个新的程序,并用新程序的代码...

  • c++ exec如何处理输入

    c++ exec如何处理输入

    在C++中,你可以使用exec函数族来执行外部命令并处理其输出
    #include #include #include #include #include int main() { std::vector args = {"ls", "-l"}...

  • linux java路径会影响系统吗

    linux java路径会影响系统吗

    在Linux系统中,Java路径通常不会直接影响系统
    Java路径主要用于告诉系统如何找到Java运行时环境(JRE)和Java开发工具包(JDK)。当你在Linux系统中安装Ja...

  • linux java路径怎样恢复

    linux java路径怎样恢复

    如果你不小心删除了 Linux 系统中的 Java 路径,可以通过以下步骤来恢复它: 首先,检查你的系统是否已经安装了 Java。在终端中输入以下命令: java -version 如...