📜  c++ 启动进程并获取输出 - C++ (1)

📅  最后修改于: 2023-12-03 15:29:52.512000             🧑  作者: Mango

C++ 启动进程并获取输出

在某些场景下,我们需要使用 C++ 程序启动一个进程,并获取其输出,比如在编译器、调试器、运行时环境等方面。本文将介绍如何使用 C++ 启动进程并获取其输出。

方案一:使用 system 函数

在 C 语言中,我们可以使用 system 函数启动一个进程并获取其输出。在 C++ 中,此函数同样适用。

代码示例:

#include <cstdlib>
#include <iostream>

int main() {
    std::string command = "ls -l";
    FILE* pipe = popen(command.c_str(), "r");
    if (!pipe) {
        std::cerr << "error: popen failed!" << std::endl;
        return EXIT_FAILURE;
    }

    char buffer[128];
    while (fgets(buffer, sizeof(buffer), pipe)) {
        std::cout << buffer;
    }

    pclose(pipe);
    return EXIT_SUCCESS;
}

注意,在使用 system 函数时,需要特别注意输入参数的安全性,避免用户输入造成的漏洞。

方案二:使用 Boost.Process 库

Boost.Process 是一个 C++ 库,提供了方便的进程管理功能。通过 Boost.Process,可以更加精准地控制进程的启动、运行和结束,同时可以更方便地获取其输出。

代码示例:

#include <boost/process.hpp>
#include <iostream>

int main() {
    boost::process::ipstream pipe_stream;
    boost::process::child child_process("ls -l", boost::process::std_out > pipe_stream);

    std::string line;
    while (std::getline(pipe_stream, line)) {
        std::cout << line << std::endl;
    }

    child_process.wait();
    return 0;
}

在使用 Boost.Process 库时,需要在编译链接时加入 -lboost_process 选项。

方案三:使用 Poco 库

Poco 是一个跨平台的 C++ 库集合,其中包含了丰富的网络、文件、XML、加密、进程等模块。通过 Poco 的 Process 模块,我们可以方便地启动进程,并获取其输出。

代码示例:

#include <Poco/Process.h>
#include <iostream>

int main() {
    Poco::Pipe out_pipe;
    Poco::ProcessHandle handle = Poco::Process::launch("ls -l", {}, &out_pipe, {});

    Poco::PipeInputStream pipe_stream(out_pipe);
    std::string line;
    while (std::getline(pipe_stream, line)) {
        std::cout << line << std::endl;
    }

    int exit_code = Poco::Process::wait(handle);
    return exit_code;
}

在使用 Poco 库时,需要在编译链接时加入 -lPocoFoundation -lPocoUtil 选项。

总结

通过以上三种方案,我们可以方便地启动进程并获取其输出。不同方案的实现方式不同,使用者可以根据需要选择合适的方案。同时,在使用时需要审慎考虑输入参数的安全性,以避免潜在的安全漏洞。