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

无需管道,子父进程能否通过文件流通信?代码读取异常求助

不用管道实现父子进程通过文件交互的问题解决

你的代码核心问题是父进程没有等待子进程完成写入操作就直接读取文件。fork 后子进程与父进程并发执行,父进程几乎会立刻打开 temp.txt 读取,此时子进程可能还没完成 echo 的输出写入,甚至文件缓存还没刷新到磁盘,所以父进程读到空内容。而程序退出后,子进程的资源被回收,文件缓存被强制刷新到磁盘,因此用 cat 能看到内容。

修改后的代码

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

int main() {
    FILE *fp;
    char *msg = "TEST MESSAGE";
    pid_t pid = fork();

    if (pid == 0) {
        fp = fopen("temp.txt", "w");
        if (fp == NULL) {
            perror("fopen failed");
            exit(1);
        }
        dup2(fileno(fp), STDOUT_FILENO);
        fclose(fp); // 复制文件描述符后关闭原流,避免资源泄漏
        execlp("echo", "echo", msg, NULL);
        perror("execlp failed"); // execlp 失败才会执行到这里
        exit(1);
    } else if (pid > 0) {
        // 等待子进程执行完毕,确保写入操作完成
        wait(NULL);
        
        fp = fopen("temp.txt", "r");
        if (fp == NULL) {
            perror("fopen read failed");
            exit(1);
        }
        char buf[1000];
        if (fgets(buf, sizeof(buf), fp) != NULL) {
            printf("received: %s\n", buf);
        } else {
            printf("read failed or file empty\n");
        }
        fclose(fp);
    } else {
        perror("fork failed");
        exit(1);
    }
    return 0;
}

关键说明

  • 添加 wait(NULL) 让父进程阻塞,直到子进程执行完毕,确保子进程的写入操作已完成并刷新到磁盘。
  • 子进程中 dup2 后关闭原文件流 fp,因为已经复制了文件描述符,原流无需保留,避免不必要的资源占用。
  • 增加了错误处理逻辑,比如文件打开失败、execlp 执行失败的情况,提升程序健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 06:10:08