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
相关产品推荐
相关产品推荐

