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

在C程序中运行二进制程序并记录按键输入的问题求助

你的代码存在的核心问题及修正方案

原代码的问题点:

  • system()函数逻辑完全错误:system("my_binary")会直接启动目标二进制程序,直到它运行结束才会返回。循环里的读取输入、写文件代码要等my_binary退出后才执行,根本做不到交互式记录输入——此时你和my_binary的交互早就结束了。
  • 文件打开模式错误:用"w"模式每次打开都会清空文件原有内容,之前的记录会全部丢失,应该用"a"(追加)模式。
  • 语法错误:fprintf(out_file, "%s ", str);里的换行写法不合法,应该写成"%s\n",否则编译会报错。
  • 缺少错误检查:fopen可能因权限不足等原因失败,fgets也可能读取失败,这些情况都没处理,容易导致程序崩溃。

正确实现思路

要同时运行交互式程序并记录输入,不能用system,得用fork()创建子进程,配合管道(pipe)处理输入的转发和记录:

  1. 创建管道,用于父子进程间传递输入。
  2. 子进程将标准输入重定向到管道读端,然后执行my_binary。
  3. 父进程负责读取用户输入,一边把输入写入管道(传给子进程),一边写入记录文件。

修正后的示例代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <string.h>

#define MAX_LIMIT 200

int main() {
    int pipe_fd[2];
    pid_t pid;
    char str[MAX_LIMIT];
    FILE *out_file;

    // 创建管道
    if (pipe(pipe_fd) == -1) {
        perror("pipe failed");
        exit(EXIT_FAILURE);
    }

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork failed");
        exit(EXIT_FAILURE);
    }

    if (pid == 0) {
        // 子进程:重定向stdin到管道读端,执行目标程序
        close(pipe_fd[1]); // 关闭子进程不需要的写端
        dup2(pipe_fd[0], STDIN_FILENO); // 替换标准输入为管道读端
        close(pipe_fd[0]); // 关闭原文件描述符

        // 执行my_binary,需确保路径正确
        execl("./my_binary", "my_binary", (char *)NULL);
        // 若execl返回,说明执行失败
        perror("execl failed");
        exit(EXIT_FAILURE);
    } else {
        // 父进程:读取用户输入,转发给子进程并记录到文件
        close(pipe_fd[0]); // 关闭父进程不需要的读端
        out_file = fopen("name_of_file", "a");
        if (!out_file) {
            perror("fopen failed");
            close(pipe_fd[1]);
            wait(NULL);
            exit(EXIT_FAILURE);
        }

        printf("开始和my_binary交互,输入内容会被记录(输入EOF结束):\n");
        while (fgets(str, MAX_LIMIT, stdin) != NULL) {
            // 转发输入给子进程
            write(pipe_fd[1], str, strlen(str));
            // 写入记录文件
            fprintf(out_file, "%s", str);
            // 强制刷新缓冲区,确保内容及时写入
            fflush(out_file);
        }

        // 清理资源
        close(pipe_fd[1]);
        fclose(out_file);
        wait(NULL); // 等待子进程结束
    }

    return 0;
}

补充说明

  • 确保my_binary是当前目录下的可执行程序,或者填写完整路径。
  • Linux下按Ctrl+D、Windows下按Ctrl+Z输入EOF,可结束交互并等待子进程退出。
  • 用"a"模式打开文件,每次运行都会追加记录,不会覆盖原有内容。

内容的提问来源于stack exchange,提问作者JohnP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:20:20