Return call_usermodehelper() 的值不正确
Return value of call_usermodehelper() is not correct
我正在使用 call_usermodehelper()
从 Linux 内核模块调用用户 space 应用程序 /usr/bin/myapp
。 myapp
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 = 180
。 Here drbd_nl.c 我找到了一个 call_usermodehelper
的例子,它也可以用 (ret >> 8) && 0xff
访问退出状态,就像 WEXITSTATUS
.
我正在使用 call_usermodehelper()
从 Linux 内核模块调用用户 space 应用程序 /usr/bin/myapp
。 myapp
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 = 180
。 Here drbd_nl.c 我找到了一个 call_usermodehelper
的例子,它也可以用 (ret >> 8) && 0xff
访问退出状态,就像 WEXITSTATUS
.