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

如何将外部管道输出存入变量?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;
}
修正说明
  1. 调整popen模式:改用"r"模式,确保能正确读取外部命令的输出结果。
  2. 读取输出到变量:通过fgets将命令的输出内容读取到block_size数组中,获取实际的块数值。
  3. 处理换行符:用strcspn定位换行符位置并替换为字符串结束符,消除输出时的换行问题。
  4. 增加错误检查:判断管道是否打开成功、是否读取到有效内容,提升程序的健壮性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:27:13