介绍一些内核给我们提供的用于在内核中创建线程的内核接口函数。

    其实在linux内核中,无论是进程还是线程,都是用struct task_struct结构体来表示的。


     用于创建一个内核线程的函数:

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

                                          void *data,

                                          const char namefmt[]);

     threadfn :将要去运行的函数实体;

     data     :传递给将要运行的函数的参数;

     namefmt  :是说创建的线程的名称;

     须知:使用 kthread_create()接口所创建的线程,并不会马上运行的,而是将其放到了等待队列中去了。如果想要让创建的线程马上运行的话,使用 wake_up_process(struct task_struct *task)函数将所创建的线程马上唤醒。


     用于停止一个内核线程:

     int kthread_stop(struct task_struct *kthread)

     返回值:如果这个kthread线程,在通过ktreadh_create()函数创建完成以后,就没有通过wake_up_process()将其唤醒的话,那么此时调用 kthread_stop()函数来停止这个线程的话,就会返回一个 -EINTR的错误码。


     用于创建一个立刻就运行的线程:

     struct task_struct *kthread_run(int (*kthreadfn)(void *data),

                                     void *data,

                                     const char namefmt[]);

     其本质上来说,kthread_run()函数其实是一个宏定义:

     #define kthread_run( int (*kthreadfn)(void *data),   \

                          void *data,                      \

                          const char namefmt[] )           \

      ({ \

        struct task_struct *kthread = kthread_create( kthread, data, namefmt[]); \

        if( !IS_ERR(kthread) )                   \

              wake_up_process(kthread);   \

        kthread;  \

       })


     所以 kthread_run()函数的返回值:成功返回线程的地址;

                                    失败返回错误地址;

    

     用于判断内核中当前的某个线程是否还在运行的函数:

     int kthread_should_stop(void)

     如果当前的某个线程还在内核中继续运行的话,kthread_should_stop()函数返回0;

     如果当前的某个线程在内核中的某个地方通过使用kthread_stop(struct task_struct *)

而被停止的话,kthread_should_stop()函数就会立即返回1。


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

                                       void *data,

                                       const char namefmt[]);

    struct task_struct *kthread_run( int (*kthreadfn)(void *data),

                                     void *data,

                                     const char namefmt[]);

    int kthread_stop(struct task_struct *kthread);

    int kthread_should_stop(void);

    内核提供的用于进行线程的创建、线程的停止的函数位于<linux/kthread.h>头文件之中;