相关文章推荐

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

其实在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>头文件之中;

 
推荐文章