Return call_usermodehelper() 的值不正确

Return value of call_usermodehelper() is not correct

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

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

示例代码如下: 用户-space的申请码:

#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;
}

However, I am receiving a different value, that is 46080.

退出状态有 8 位,return 值与 waitpid return 值一样。请参阅 WEXITSTATUS 的用户空间定义以访问退出状态,即 46080 >> 8 = 180,等于 returned 退出状态 2228 % 256 = 180Here drbd_nl.c 我找到了一个 call_usermodehelper 的例子,它也可以用 (ret >> 8) && 0xff 访问退出状态,就像 WEXITSTATUS.