call_usermodehelper()的返回值不正确



我正在使用call_usermodehelper()从Linux内核模块调用用户空间应用程序/usr/bin/myapp。CCD_ 3在退出时返回2228。我应该接收与内核模块中call_usermodehelper()的返回值相同的值,即2228。然而,我收到了一个不同的值,即46080。

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

以下是示例代码:用户空间的应用程序代码:

#include <stdio.h>
int main(int argc, char *argv[])
{
printf("%s called successfullyn", 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;
}

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

退出状态有8位,返回值与waitpid返回值相同。参见WEXITSTATUS的用户空间定义,访问退出状态,即46080 >> 8 = 180,等于返回的退出状态2228 % 256 = 180。在这里,drbd_nl.c我发现了一个call_usermodehelper的例子,它也使用(ret >> 8) && 0xff访问退出状态,就像WEXITSTATUS一样。

最新更新