📅  最后修改于: 2023-12-03 15:29:52.512000             🧑  作者: Mango
在某些场景下,我们需要使用 C++ 程序启动一个进程,并获取其输出,比如在编译器、调试器、运行时环境等方面。本文将介绍如何使用 C++ 启动进程并获取其输出。
在 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 是一个 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 是一个跨平台的 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
选项。
通过以上三种方案,我们可以方便地启动进程并获取其输出。不同方案的实现方式不同,使用者可以根据需要选择合适的方案。同时,在使用时需要审慎考虑输入参数的安全性,以避免潜在的安全漏洞。