C 代码 - 尝试通过 system() 调用返回整数值

问题描述 投票:0回答:1

我的 C 代码中遇到一个问题,即我的系统调用未触发 if 语句。我的代码正在尝试检测 LKSCTP 是否已加载。

当 LKSCTP 未加载到内核中时,“/sbin/lsmod | grep sctp | wc -l”将返回 0。在这种情况下,程序应该退出并输出 2 行。

如果已加载,则返回非零数字,程序应继续。

但是,在这两种情况下,“wc -l”的行数都被打印(?),并且与 0 相比不正确,并且程序正在退出。

第一次尝试:

if ( system("/sbin/lsmod |grep sctp |wc -l") == 0 )
{
    /* no output, sctp is not loaded */
    ULCM_MSG("'/sbin/lsmod |grep sctp' failed! LKSCTP cannot be loaded.");
    ULCM_MSG("LKSCTP not installed or black-listed.");
    exit(1);
}

输出:

4 9 月 25 日 14:45:34.648 '/sbin/lsmod |grep sctp' 失败!无法加载 LKSCTP。 9 月 25 日 14:45:34.648 LKSCTP 未安装或已列入黑名单。

第二次尝试(尝试将返回值转换为整数):

int check = -1;

check = system("/sbin/lsmod |grep sctp |wc -l");
if(check == 0)
{
    /* no output, sctp is not loaded */
    ULCM_MSG("'/sbin/lsmod |grep sctp' failed! LKSCTP cannot be loaded.");
    ULCM_MSG("LKSCTP not installed or black-listed.");
    exit(1);
}

输出:同上。

我尝试将 system() 返回值转换为整数。我需要能够检查“lsmod | grep sctp | wc -l”值以获取通过/失败的零/非零值。

c linux system
1个回答
2
投票
只要能够从管道中读取数据,

wc -l
总是返回成功(退出代码 0)。在 shell 中尝试一下:
echo -n '' | wc -l; echo $?
echo hello | wc -l; echo $?
都会在末尾打印 0。不管有没有行数。我觉得您将退出代码与标准输出混淆了。

但是,我认为您已经采用了过于复杂的方式 - 您可以删除

wc -l
并简单地检查
grep
的退出代码是否为非零,因为
grep
will 会给您一个非零退出未找到模式时的代码(再次检查您的 shell:
echo foo | grep hi; echo $?
显示 1,而
echo hi | grep hi; echo $?
显示 0)。

if ( system("/sbin/lsmod | grep sctp") != 0 )
© www.soinside.com 2019 - 2024. All rights reserved.