如何将外部管道输出存入变量?C语言磁盘块大小获取问题
问题分析
- popen模式错误:原代码用
"w"模式打开管道,这是用于向管道写入数据的,而我们需要读取外部命令的输出,应该使用"r"模式。 - 错误输出FILE指针:直接用
printf的%s格式输出file(FILE指针)属于未定义行为,根本无法获取命令的实际输出内容。 - 输出换行问题:外部命令的输出结果自带换行符,导致最终输出时数值和前面的文本分行显示。
修正后的代码
#include <stdio.h> #include <string.h> #include <stdlib.h> int main () { char block_size[128] = {0}; // 初始化数组,避免残留垃圾值 // 修正popen模式为"r",用于读取命令输出 FILE* pipe = popen("/usr/sbin/prtvtoc /dev/rdsk/c0b0t2d0s0 |/usr/local/bin/grep 'slice 0' -A 2|grep length|cut -d : -f 3|cut -d '(' -f 1|cut -c 2-1000", "r"); if (pipe == NULL) { // 增加管道打开失败的错误检查 perror("popen failed"); return 1; } // 从管道读取输出内容到变量 if (fgets(block_size, sizeof(block_size), pipe) != NULL) { // 移除字符串末尾的换行符 block_size[strcspn(block_size, "\n")] = '\0'; // 按期望格式输出 printf("The size in 512b blocks of the disk /dev/rdsk/c0b0t2d0s0del is %s\n", block_size); } else { printf("Failed to read disk size\n"); } pclose(pipe); return 0; }
修正说明
- 调整popen模式:改用
"r"模式,确保能正确读取外部命令的输出结果。 - 读取输出到变量:通过
fgets将命令的输出内容读取到block_size数组中,获取实际的块数值。 - 处理换行符:用
strcspn定位换行符位置并替换为字符串结束符,消除输出时的换行问题。 - 增加错误检查:判断管道是否打开成功、是否读取到有效内容,提升程序的健壮性。
内容的提问来源于stack exchange,提问作者elbarna
相关产品推荐
相关产品推荐

