【问题标题】:Return value of call_usermodehelper() is not correctcall_usermodehelper() 的返回值不正确
【发布时间】:2021-10-27 02:16:58
【问题描述】:

我正在使用call_usermodehelper() 从 Linux 内核模块调用用户空间应用程序/usr/bin/myappmyapp 退出时返回 2228。我应该收到相同的值,即 2228 作为内核模块中call_usermodehelper() 的返回值。但是,我收到了一个不同的值,即 46080。

我的问题是,为什么我没有收到我从myapp 返回的值作为call_usermodehelper() 的返回值?注意,当我使用call_usermodehelper() 从内核模块调用myapp 时,它会成功执行。我不返回 0 作为成功代码。我退出时返回 2228。

下面是示例代码: 用户空间的应用代码:

#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("%s called successfully\n", argv[0]);
    return 2228;
}

内核模块的代码:

int call_userspaceapp()
{
    int ret = -EPERM;
    char *argv[] = {"/usr/bin/myapp", "11", "22", "33", NULL};
    char *envp[] = {"HOME=/", NULL};

    ret = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);

    printk("%s returns value %d", argv[0], ret);

    return ret;
}

【问题讨论】:

  • 在 Linux 中,您不能可靠地返回大于 255 的值。例如从终端echo $? 运行程序后将显示180,这是2228 的低8 位。参见例如that question关于返回值可以有多少。
  • 谢谢@Tsyvarev。看来你说的是实话。但是,我仍然无法理解为什么会这样?我的意思是 call_usermodehelper() 的文档从未提及它。这件事应该有一些理由。
  • call_usermodehelper 没有记录,因为它不是特定于该命令。它是程序返回值的属性一般

标签: linux-kernel linux-device-driver kernel-module


【解决方案1】:

但是,我收到了一个不同的值,即 46080。

退出状态有8位,返回值就像waitpid返回值。查看WEXITSTATUS的用户空间定义访问退出状态,即46080 &gt;&gt; 8 = 180,等于返回的退出状态2228 % 256 = 180Here drbd_nl.c 我找到了一个call_usermodehelper 的示例,它也使用(ret &gt;&gt; 8) &amp;&amp; 0xff 访问退出状态,就像WEXITSTATUS 一样。

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2021-10-26
    • 2015-10-13
    • 2014-12-06
    • 2021-02-01
    • 2017-08-21
    • 2021-02-10
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多