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

C语言中pipe与dup2的用法问题:如何让代码实现预期输出?

问题解决方案

原代码存在两个核心问题导致无法得到预期输出:

  1. printf输出的内容因标准输出的缓冲机制,没有被立即写入管道
  2. 读取到缓冲区的字符串没有添加字符串终止符,fprintf无法正确识别字符串结尾

修改后的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    int fd[2];
    pipe(fd);
    dup2(fd[1], 1); 
    close(fd[1]);

    printf("I wanna print this.");
    fflush(stdout); // 强制刷新标准输出,将缓冲内容写入管道

    char *buf = malloc(100);
    if (!buf) {
        fprintf(stderr, "malloc failed\n");
        return 1;
    }
    ssize_t read_len = read(fd[0], buf, 50);
    if (read_len > 0) {
        buf[read_len] = '\0'; // 添加字符串终止符
    }

    fprintf(stderr, ">>>%s<<<\n", buf);

    close(fd[0]);
    free(buf); // 释放malloc的内存,避免泄漏
    return 0;
}

修改说明:

  • 添加fflush(stdout):标准输出被重定向到管道后,缓冲模式变为全缓冲,不会自动刷新,手动强制刷新才能把printf的内容写入管道。
  • 为buf添加字符串终止符:read只会读取字节数据,不会自动添加'\0',手动添加后fprintf才能正确打印完整字符串。
  • 增加malloc的错误检查和内存释放:避免潜在的内存泄漏和空指针问题。
  • 捕获read的返回值,确保只在成功读取时添加终止符,提升代码健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:40:15