内核编程中的进程启动、信号处理与符号使用
1. 从内核启动新进程
在系统中,所有进程实际上都是由内核代码启动的,那么能否从模块代码中启动新的用户进程呢?答案是肯定的。用户空间的新进程可以由内核代码启动,形式上类似于用户代码中使用 exec*() 系列调用,但内容上有不同的含义。
用户代码创建进程分两步:首先执行 fork() 创建一个新的地址空间,它是父进程的完全副本;然后调用 exec() 系列函数之一,使这个地址空间成为新进程的空间。而在内核空间,不能创建内核空间的副本,为此提供了特殊调用 call_usermodehelper() 。
以下是一个简单示例 mod_exec.c :
#include <linux/module.h>
#include <linux/delay.h>
static char *str = NULL;
module_param(str, charp, S_IRUGO);
int __init exec_init(void) {
int rc;
char *argv[] = { "wall", "\nthis is wall message ", NULL },
*envp[] = { NULL },
msg[ 80 ];
if(str) {
sprintf(msg, "\n%s", str);
argv[1] = msg;
}
超级会员免费看
订阅专栏 解锁全文
33

被折叠的 条评论
为什么被折叠?



