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

C语言中system()调用判断LKSCTP加载状态失败问题

解决system()调用判断LKSCTP内核模块加载状态的问题

你的核心问题是混淆了system()的返回值含义:system()返回的是执行命令的退出状态码,不是命令的标准输出内容。

问题根源分析

你使用的命令/sbin/lsmod | grep sctp | wc -l中,wc -l仅负责输出匹配到的行数,但无论它输出0还是其他数字,只要命令本身执行成功,wc的退出状态码都是0。这就导致不管LKSCTP是否加载,system()都会返回0,你的if (check == 0)条件永远成立,程序始终执行退出分支;同时wc -l的输出会直接打印到终端,也就是你看到的数字结果。

解决方案一:用grep的退出状态直接判断(推荐)

不需要wc -l,直接利用grep的退出状态特性:当grep匹配到内容时退出状态为0,未匹配到则为1。加上-q参数让grep静默执行,不输出任何内容,仅返回状态。

修改后的代码:

// 检查sctp模块是否加载,grep -q静默匹配,仅返回状态
if (system("/sbin/lsmod | grep -q sctp") != 0) {
    ULCM_MSG("LKSCTP is not loaded.");
    ULCM_MSG("LKSCTP not installed or black-listed.");
    exit(1);
}
// 模块已加载,继续执行后续逻辑

逻辑说明:

  • 当LKSCTP已加载时,grep匹配到内容,退出状态0,system()返回0,条件不成立,程序继续执行
  • 当LKSCTP未加载时,grep未匹配到,退出状态1,system()返回非0,条件成立,执行退出分支

解决方案二:捕获命令输出进行判断(适合需要获取行数的场景)

如果确实需要获取匹配的行数,不能用system(),需要用popen()捕获命令的标准输出,再解析输出内容:

FILE *cmd_fp = popen("/sbin/lsmod | grep sctp | wc -l", "r");
if (cmd_fp == NULL) {
    ULCM_MSG("Failed to execute module check command.");
    exit(1);
}

char output_buf[16];
int match_count = 0;
// 读取命令输出
if (fgets(output_buf, sizeof(output_buf), cmd_fp) != NULL) {
    match_count = atoi(output_buf); // 转成整数
}

pclose(cmd_fp); // 关闭管道

if (match_count == 0) {
    ULCM_MSG("LKSCTP is not loaded.");
    ULCM_MSG("LKSCTP not installed or black-listed.");
    exit(1);
}
// 模块已加载,继续执行后续逻辑

内容的提问来源于stack exchange,提问作者Izerman Uln'hyrr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:35:18