代码之家  ›  专栏  ›  技术社区  ›  Izerman Uln'hyrr

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

  •  0
  • Izerman Uln'hyrr  · 技术社区  · 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()return强制转换为整数。我需要能够检查“lsmod|grep-sctp|wc-l”值是否为通过/失败的零/非零值。

    2 回复  |  直到 1 年前
        1
  •  7
  •   CherryDT Ravi Shankar    1 年前

    wc -l 始终返回成功(退出代码0),只要它能够从管道中读取。在你的壳里试试:两者都有 echo -n '' | wc -l; echo $? echo hello | wc -l; echo $? 将在末尾打印0。不管是否有要计数的行。我觉得你混淆了 exit code 将值打印到stdout。

    然而,我认为你已经走得太复杂了——你可以删除 wc-l 并简单地检查 grep 为非零,因为 grep 当找不到模式时,给你一个非零的退出代码(表示失败)(再次检查你的shell: echo foo | grep hi; echo $? 显示1 while echo hi | grep hi; echo $? 显示0)。

    此外,正如用户zwol在评论中指出的,您可以使用 -q 的论点 grep 抑制它找到的stdout行的输出,因为您对它不感兴趣。退出代码仍将被设置。

    if ( system("/sbin/lsmod | grep -q sctp") != 0 )
    

    你甚至可以摆脱 != 0 现在,但为了清楚起见,我把它留了下来。

        2
  •  1
  •   chrslg    1 年前

    /sbin/lsmod |grep sctp |wc -l 不会返回0(或者,更准确地说,是的,它会返回,但会一直返回)。您的意思是,它将在标准输出上打印字符串“0”。 它们返回退出代码0,这意味着 wc 计数行数没有失败(计数0行时没有遇到任何问题)。

    同样,如果存在模块 sctp , /sbin/lsmod | grep sctp | wc -l 将在标准输出上显示字符串“1”,但返回0,这意味着它在计数1行输出时没有问题 grep

    所以,你需要做的是

    • 读取的标准输出 /sbin/lsmod|grep-sctp|wc-l 。这需要比 system (除非您使用一些丑陋的临时文件解决方案)。你必须 fork/pipe/exec/read 一个过程。
    • 依靠 系统 返回值,但要尽一切努力,以便通过退出代码传输您需要知道的信息。

    例如,您可以 system("/sbin/lsmod | grep scpt")

    如果确实存在 scpt 线路输入 lsmod 输出如果没有,则为1。

    一个陷阱,tho:返回非0退出代码还有其他原因。例如 lsmod 不可能存在。或者它可能存在,但你无法运行。或者它可能存在并失败。等等。