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

调用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函数就直接退出。此时子进程可能还在读取文件、输出最后一行内容,但父进程退出会触发两个关键影响:

  1. 父进程退出后,shell会立即接管终端并输出提示符,可能覆盖子进程尚未打印的内容;
  2. 子进程的标准输出缓冲区可能还没来得及刷新最后一行数据,就因为终端关联的变化或资源回收导致输出中断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:06:09