在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
创建了子进程。子进程将执行命令,并将标准输出重定向到管道的写入端。父进程将子进程的标准输出重定向到自己的标准输出,并读取过滤后的输出。你可以根据需要修改过滤逻辑。