如何从内核空间调用用户空间程序
来源:互联网 发布:软件需求分析模板 编辑:程序博客网 时间:2024/05/17 03:55
在include/linux/kmod.h中,我们可以找到API函数call_usermodehelper
的定义:
static inline intcall_usermodehelper(char *path, char **argv, char **envp, enum umh_wait wait)
{
...
}
它实际上是调用了kernel/kmod.c中定义的函数
call_usermodehelper_exec,有关细节可以去看一下kmod.c
中的实现,下面
我们仅仅分析在不同的上下文中如何使用这个API,该函数提供
char *path, char **argv, char **envp 这些指针,
以及enum umh_wait wait(
一个枚举类型:不等待、等待进程被执行及等待进程完全结束)
这几个参数。
下面从一个实例来演示一下如何使用该API:
static int do_sendlog_user(int port, u32 link, u32 duplex, u32 speed)
{
static char *speed_desc[] = {"10","100","1000","0"};
static char *log_path = "/usr/sbin/do_sendlog.sh";
static char *log_envp[] = { "HOME=/",
"TERM=linux",
"PATH=/sbin:/usr/sbin:/bin:/usr/bin",
NULL };
char arg_type[32];
char arg_port[32];
char arg_link[32];
char arg_duplex[32];
char arg_speed[32];
char *log_argv[] = { log_path,
arg_type,
arg_port,
arg_link,
arg_duplex,
arg_speed,
NULL};
strcpy(arg_type, "PORT_STATUS");
sprintf(arg_port, "%u", port);
sprintf(arg_link, "%s", link ? "linkup" : "linkdown");
sprintf(arg_duplex, "%s", duplex ? "fdx" : "hdx");
sprintf(arg_speed, "%s", speed_desc[speed]);
printk("%s port %d, link %d, duplex %d, speed %d\n", __FUNCTION__, port, link, duplex, speed);
call_usermodehelper(log_path, log_argv, log_envp, UMH_WAIT_EXEC);
return 0;
}
值得注意的是最后一个参数,
enum umh_wait wait有以下几个值,它们都会创建一个内核线程来异步执行用户空间程序,只是在同步的方式上有所区别:
UMH_NO_WAIT:立即返回,可以用于中断上下文中,如果在进程上下文中,会出现调用者所在函数已经回收局部变量后用户程序都仍未执行的情况,
这时所传递的其它参数可能会是一个无法确定的值,
_EXEC:用户空间程序执行则立即返回UMH_WAIT
UMH_WAIT_PROC:等待用户程序执行完毕再返回
对于我个人的应用场合来说,大多选择
模式,既不会阻塞于用户空间程序,也不会出现参数传递失败的情况
_EXECUMH_WAIT
- 如何从内核空间调用用户空间程序
- 如何在linux内核中调用用户空间的程序
- 如何在linux内核中调用用户空间的程序
- 如何在linux内核中调用用户空间的程序
- 如何在linux内核中调用用户空间的程序
- 如何在linux内核中调用用户空间的程序
- Linux系统调用详解(如何从用户空间进入内核空间)
- 内核空间调用用户空间程序-kernel_execve分析及总结
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- linux内核空间和用户空间的是怎样区别的,如何交互,如何从用户空间进入内核空间
- JSF,第二代Java页面技术
- 收藏的网页-DotNet
- curl 下载repo脚本出错以及下载android 源码
- myisam不适合大量更新操作
- JAVA学习(十二)__关于JAVA代码里黄色警告线的注意方法(自己整理)
- 如何从内核空间调用用户空间程序
- 写css给一个表table做边框
- ARM寄存器中a1、ip的含义 ARM寄存器的别名
- 输出下列图形 * *** ***** *******
- Matlab 使用栈判断括号是否匹配
- 常见的cpu型号的术语
- 手机端GSP地图的定位 并且在网页上显示地图的轨迹
- 关于相对布局中控件摆放位置的一个需要注意的小地方
- 设计模式之原型模式