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

C语言调用popen执行netstat命令无输出问题如何解决

C语言popen调用netstat输出为空的修正方案

核心问题原因

  • 字符串转义错误
    C语言双引号包裹的字符串中,\b会被编译器解析为ASCII退格控制符,而非你预期传给grep的单词边界正则标记。最终实际执行的grep匹配规则错误,自然无匹配结果输出。
  • 读取逻辑缺陷
    fscanf的%s格式化符遇到空格就会终止读取,netstat输出行包含多个空格分隔的字段,就算有匹配结果也只能读取到首个字段内容,无法拿到完整行。
  • 资源操作不规范
    popen开启的文件指针必须用pclose关闭,用fclose属于未定义行为,可能导致输出缓冲区内容未正常刷新。
  • 缺少异常判断
    代码未判断popen的返回值,如果命令执行失败(如netstat未安装、权限不足),直接调用fscanf读取空指针也会无输出。

修正后的完整代码

#include<stdio.h>
#include<string.h>

int main()
{
        FILE *fp = NULL;
        char HTTPS_LISTEN_STATE[500]={0};
        // 转义反斜杠,保证传给shell的是\b单词边界标记
        fp = popen("netstat -an | grep '\\b443\\b'","r");
        if (fp == NULL) {
            perror("popen执行失败");
            return 1;
        }
        // 用fgets读取整行内容
        if (fgets(HTTPS_LISTEN_STATE, sizeof(HTTPS_LISTEN_STATE), fp) != NULL) {
            printf("%s", HTTPS_LISTEN_STATE);
        } else {
            printf("未找到443端口监听记录\n");
        }
        pclose(fp);
        return 0;
}

额外优化建议

  • 部分新的Linux发行版默认未安装net-tools包(包含netstat命令),可以换用兼容性更好的ss命令,将执行命令替换为ss -an | grep '\\b443\\b'即可。
  • 如果需要读取所有匹配的多行结果,可以用循环调用fgets直到返回NULL。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:45:04