【发布时间】:2021-10-27 02:16:58
【问题描述】:
我正在使用call_usermodehelper() 从 Linux 内核模块调用用户空间应用程序/usr/bin/myapp。 myapp 退出时返回 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