You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从终端读取行后通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:06:08