调用cat程序未打印输入文件最后一行的原因咨询(OS新手)
问题分析:为何
cat未打印文件最后一行? 你的代码
#include <unistd.h> // for close, fork #include <stdio.h> #include <fcntl.h> // for open int main() { char *argv[2]; argv[0] = "cat"; argv[1] = 0; if (fork() == 0) { close(0); open("input.txt", O_RDONLY); execvp("cat", argv); } }
输入文件input.txt内容
Hello I am Sam
实际输出
Hello I am
问题原因
核心问题在于父进程在子进程完成输出前就直接退出了,导致终端输出被截断。
调用fork()创建子进程后,你的父进程没有任何等待逻辑,执行完main函数就直接退出。此时子进程可能还在读取文件、输出最后一行内容,但父进程退出会触发两个关键影响:
- 父进程退出后,shell会立即接管终端并输出提示符,可能覆盖子进程尚未打印的内容;
- 子进程的标准输出缓冲区可能还没来得及刷新最后一行数据,就因为终端关联的变化或资源回收导致输出中断。
cat程序逐行读取文件并输出,但如果父进程先结束,子进程的输出流程会被终端的状态变化打断,最终导致最后一行无法正常显示。
解决方法
在父进程中添加wait()或waitpid()调用,等待子进程执行完毕后再退出,确保子进程的所有输出都能被终端完整接收:
#include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <sys/wait.h> // 新增头文件 int main() { char *argv[2]; argv[0] = "cat"; argv[1] = NULL; pid_t pid = fork(); if (pid == 0) { close(0); open("input.txt", O_RDONLY); execvp("cat", argv); } else if (pid > 0) { wait(NULL); // 父进程等待子进程执行结束 } }
另外提醒:实际编程中要养成检查系统调用返回值的习惯,比如open调用可能失败(文件不存在、权限不足等),此时子进程的标准输入会是无效描述符,应该添加错误处理逻辑。
内容的提问来源于stack exchange,提问作者Vedanta Mohapatra
相关产品推荐
相关产品推荐

