阅读量:2
在C++中,你可以使用exec函数族来执行外部命令并处理其输出
#include
#include
#include
#include
#include
int main() {
std::vector args = {"ls", "-l"}; // 示例命令:列出当前目录的文件
pid_t pid = fork(); // 创建子进程
if (pid == 0) { // 子进程
execvp(args[0].c_str(), args.data()); // 执行命令
perror("execvp"); // 如果执行失败,打印错误信息
exit(EXIT_FAILURE); // 退出子进程
} else if (pid > 0) { // 父进程
int status;
waitpid(pid, &status, 0); // 等待子进程完成
if (WIFEXITED(status)) { // 检查子进程是否正常退出
std::cout << "子进程返回状态: " << WEXITSTATUS(status) << std::endl;
} else {
std::cerr << "子进程异常退出" << std::endl;
}
} else { // fork失败
perror("fork");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
在这个示例中,我们使用fork()创建了一个子进程,然后在子进程中使用execvp()执行了一个ls -l命令。父进程会等待子进程完成,并检查其返回状态。
如果你需要从标准输入读取数据并将其传递给外部命令,可以使用popen()和pclose()函数。例如:
#include
#include
#include
int main() {
std::istringstream input("file.txt"); // 从文件创建输入流
std::streambuf* cinbuf = std::cin.rdbuf(); // 保存原始标准输入缓冲区
std::cin.rdbuf(input.rdbuf()); // 将标准输入缓冲区替换为文件输入流
FILE* pipe = popen("grep example", "r"); // 执行命令并获取管道
if (!pipe) {
std::cerr << "popen() failed!" << std::endl;
return EXIT_FAILURE;
}
char buffer[128];
while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
std::cout << buffer;
}
pclose(pipe); // 关闭管道
std::cin.rdbuf(cinbuf); // 恢复原始标准输入缓冲区
return EXIT_SUCCESS;
}
在这个示例中,我们使用popen()执行了一个grep example命令,并将标准输入替换为一个文件输入流。然后我们从该流中读取数据并将其输出到标准输出。最后,我们使用pclose()关闭管道并恢复原始标准输入缓冲区。
以上就是关于“c++ exec如何处理输入”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm