如何从终端读取行后通过exec命令传递给另一个C++程序?
解决方案
你可以根据文本长度选择以下两种常用方案实现进程间文本传递:
方案1:命令行参数传递(适合短文本)
如果读取的文本长度不超过系统命令行参数限制(通常为几十KB以内),可以直接将文本作为运行参数传给program2。
修正后程序1代码片段
你原有代码的execl存在笔误,第一个参数为可执行文件路径,应补全为./program2,修改后子进程逻辑如下:
else if (pid == 0) { // 将std::string转为C风格字符串作为参数传入 execl("./program2", "./program2", line.c_str(), NULL); // execl仅执行失败时才会返回,需补充错误处理 perror("execl执行失败"); exit(1); }
program2读取逻辑
直接从main函数的入参中读取即可:
#include <iostream> #include <string> int main(int argc, char* argv[]) { if (argc < 2) { std::cerr << "未接收到输入参数" << std::endl; return 1; } std::string received_text = argv[1]; // 后续业务逻辑 return 0; }
方案2:匿名管道传递(适合任意长度文本,无需修改program2)
如果文本较长,或者你不想修改program2的原有读取逻辑(program2原本就从标准输入读取内容),可以使用匿名管道实现数据传递,原理是将父进程读取的文本写入管道,子进程把标准输入重定向到管道读端,program2直接从std::cin读取就能拿到内容。
完整程序1实现代码
#include <iostream> #include <string> #include <unistd.h> #include <sys/wait.h> int main(int argc, const char * argv[]) { std::string line; std::getline(std::cin, line); int pipefd[2]; if (pipe(pipefd) == -1) { perror("管道创建失败"); exit(1); } pid_t pid = fork(); if (pid < 0) { perror("Fork失败"); exit(1); } else if (pid == 0) { // 子进程关闭管道写端 close(pipefd[1]); // 将管道读端重定向到标准输入 dup2(pipefd[0], STDIN_FILENO); close(pipefd[0]); // 运行program2,无需额外传参 execl("./program2", "./program2", NULL); perror("execl执行失败"); exit(1); } else { // 父进程关闭管道读端 close(pipefd[0]); // 将读取到的文本写入管道 write(pipefd[1], line.c_str(), line.size()); // 可选:写入换行符匹配getline的行结束逻辑,根据program2的读取规则调整 write(pipefd[1], "\n", 1); close(pipefd[1]); // 等待子进程退出,避免产生僵尸进程 wait(NULL); } return 0; }
补充方案(极端场景用)
如果文本大小超过数百MB,可以将内容写入临时文件,把临时文件路径作为参数传给program2读取,读取完成后删除临时文件即可。
内容的提问来源于stack exchange,提问作者Osama Naeem
相关产品推荐
相关产品推荐

