我正在使用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
一样。