C语言中pipe与dup2的用法问题:如何让代码实现预期输出?
问题解决方案
原代码存在两个核心问题导致无法得到预期输出:
printf输出的内容因标准输出的缓冲机制,没有被立即写入管道- 读取到缓冲区的字符串没有添加字符串终止符,
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
相关产品推荐
相关产品推荐

