转自:l
kthread_create与kernel_thread的区别
kernel thread可以用kernel_thread创建,但是在执行函数里面必须用daemonize释放资源并挂到init下,还需要用completion等待这一过程的完成。
kthread_create是比较正牌的创建函数,这个不必要调用daemonize,用这个创建的kernel thread都挂在了kthread线程下。从表面上来看,这两个函数非常的类似,但是实现却是相差甚远。kthread_create是通过work_queue来实现的,kernel_thread是通过do_fork来实现的。kthread_create:DECLARE_WORK(work, keventd_create_kthread, &create);调用keventd_create_kthread,keventd_create_kthread中调用kernel_thread: pid = kernel_thread(kthread, create, CLONE_FS | CLONE_FILES | SIGCHLD);参考:http://www.scs.ch/~frey/linux/kernelthreads.htmlhttp://kernelnewbies.org/Simple_UDP_Serverhttp://mail.nl.linux.org/kernelnewbies/2006-07/msg00373.htmlkernel_thread 的使用
作者:Penna 日期:2009-04-20
字体大小: 小 中 大
![](http://writeblog.csdn.net/images/weather/hn2_sunny.gif)
![](http://writeblog.csdn.net/images/weather/hn2_t_sunny.gif)
![](http://writeblog.csdn.net/images/level3.gif)
转载文章,版权归原作者所有。
原文出处:可以在非内核线程中调用kernel_thread, 但这样创建的线程必须在自己调用daemonize(...)来释放资源, 成为真正的内核线程。
#include #include static int noop(void *dummy) { int i = 0; daemonize("mythread"); while(i++ < 5) { printk("current->mm = %p\n", current->mm); printk("current->active_mm = %p\n", current->active_mm); set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(10 * HZ); } return 0; } static int test_init(void) { kernel_thread(noop, NULL, CLONE_KERNEL | SIGCHLD); return 0; } static void test_exit(void) {} module_init(test_init); module_exit(test_exit); ”mythread“就是给这个内核线程取的名字, 可以用ps -A来查看。 schedule()用于进程调度, 可以理解为放弃CPU的使用权.kernel thread可以用kernel_thread创建,但是在执行函数里面必须用daemonize释放资源并挂到init下,还需要用completion等待这一过程的完成。
kthread_create是比较正牌的创建函数,这个不必要调用daemonize,用这个创建的kernel thread都挂在了kthread线程下。