介绍一些内核给我们提供的用于在内核中创建线程的内核接口函数。
其实在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>头文件之中;