内核线程

内核线程可以用户两种方法实现:

1. 古老的方法

创建内核线程:

ret = kernel_thread(mykthread, NULL, CLONE_FS | CLONE_FILES | CLONE_SIGHAND | SIGCHLD);

 

内核线程方法的实现

static DECLARE_WAIT_QUEUE_HEAD(myevent_waitqueue);

rwlock_t myevent_lock;

extern unsigned int myevent_id;

 

static int mykthread(void *unused)

{

       unsigned int event_id = 0;

       DECLARE_WAITQUEUE(wait, current);

       //将此线程作为kthreadd的子进程,成为一个内核线程,不占用用户资源

       daemonize(“mykthread”);

 

       //daemonize()默认阻塞所有信号,所以

       allow_signal(SIGKILL);

 

       add_wait_queue(&myevent_waitqueue, &wait);

 

       for ( ; ;)

       {

              set_current_state(TASK_INTERRUPTIBLE);

              schedule();

              if ( signal_pending(current) )

                     break;

 

              read_lock(&myevent_lock);

              if ( myevent_id)

              {

                     event_id = myevent_id;

                     read_unlock(&myevent_lock);

                     run_umode_handler(event_id);

              }

              else

              {

                     read_unlock(&myevent_lock);

              }

       }

      

       set_current_state(TASK_RUNNING);

       remove_wait_queue(&myevent_waitqueue, &wait);

       return 0;

}

 

2. 现代方法(从2.6.23起)

       创建内核线程更现代的方法是辅助函数kthread_create

函数原型:

struct task_struct *kthread_create(int (*threadfin)(void *data),

void *data,

const char namefmt[],

…)

 

例子如下:

#include <linux/kthread.h>   // kernel thread helper interface

#include <linux/completion.h>

#include <linux/module.h>

#include <linux/sched.h>

#include <linux/init.h>

 

MODULE_LICENSE("Dual BSD/GPL");

MODULE_AUTHOR("fuyajun1983cn@yahoo.com.cn");

 

struct task_struct *my_task;                     

 

/* Helper thread */

static int

my_thread(void *unused)

{

 

  while (!kthread_should_stop()) {

   

       set_current_state(TASK_INTERRUPTIBLE);

       schedule();

       printk("I am still running/n");

 

  }

 

  /* Bail out of the wait queue */

  __set_current_state(TASK_RUNNING);

 

   return 0;

}

 

/* Module Initialization */

static int __init

my_init(void)

{

  /* ... */

 

 /*   my_task = kthread_create(my_thread, NULL, "%s", "my_thread");

    if (my_task) wake_up_process(my_task);

*/

     /*kthread_run会调用kthread_create函数创建新进程,并立即唤醒它*/

     kthread_run(my_thread, NULL, "%s", "my_thread");*/

 

    /* ... */

 

 

  /* ... */

  return 0;

}

 

/* Module Release */

static void __exit

my_release(void)

{

  /* ... */

  kthread_stop(my_task);

  /* ... */

}

 

module_init(my_init);

module_exit(my_release);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值