在C程序中运行二进制程序并记录按键输入的问题求助
你的代码存在的核心问题及修正方案
原代码的问题点:
- system()函数逻辑完全错误:
system("my_binary")会直接启动目标二进制程序,直到它运行结束才会返回。循环里的读取输入、写文件代码要等my_binary退出后才执行,根本做不到交互式记录输入——此时你和my_binary的交互早就结束了。 - 文件打开模式错误:用
"w"模式每次打开都会清空文件原有内容,之前的记录会全部丢失,应该用"a"(追加)模式。 - 语法错误:
fprintf(out_file, "%s ", str);里的换行写法不合法,应该写成"%s\n",否则编译会报错。 - 缺少错误检查:
fopen可能因权限不足等原因失败,fgets也可能读取失败,这些情况都没处理,容易导致程序崩溃。
正确实现思路
要同时运行交互式程序并记录输入,不能用system,得用fork()创建子进程,配合管道(pipe)处理输入的转发和记录:
- 创建管道,用于父子进程间传递输入。
- 子进程将标准输入重定向到管道读端,然后执行
my_binary。 - 父进程负责读取用户输入,一边把输入写入管道(传给子进程),一边写入记录文件。
修正后的示例代码
#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
相关产品推荐
相关产品推荐

