linux内核中的线程创建接口

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

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

时间: 2024-08-29 11:53:20

linux内核中的线程创建接口的相关文章

linux内核中socket的创建过程源码分析(总结性质)

http://www.jianshu.com/p/5d82a685b5b6 在漫长地分析完socket的创建源码后,发现一片浆糊,所以特此总结,我的博客中同时有另外一篇详细的源码分析,内核版本为3.9,建议在阅读本文后若还有兴趣再去看另外一篇博文.绝对不要单独看另外一篇. 一:调用链: 二:数据结构 一一看一下每个数据结构的意义: 1) socket, sock, inet_sock, tcp_sock的关系创建完sk变量后,回到inet_create函数中: 这里是根据sk变量得到inet_s

linux内核中socket的创建过程源码分析(详细分析)

http://www.cnblogs.com/hyd-desert-camel/p/3536341.html 1三个相关数据结构. 关于socket的创建,首先需要分析socket这个结构体,这是整个的核心. 104 struct socket { 105         socket_state            state; 106 107         kmemcheck_bitfield_begin(type); 108         short                 

linux内核中的排序接口--sort函数

linux内核中的sort函数,事实上跟我们所说的qsort函数非常像,我们来看看qsort: qsort 的函数原型是 void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 參数:  1 .待排序数组首地址 2 .数组中待排序元素数量 3 .各元素的占用空间大小 4 .指向函数的指针.用于确定排序的顺序. 当中compare函数应写为: 1 2 3 4 int c

Linux内核中添加系统调用接口简单示例

1. Linux体系结构 Linux系统的地址空间分为用户空间和内核空间,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移. 2. 系统调用接口 ① 一般情况下,用户进程不能访问内核空间.Linux内核中提供了一组用于实现各种系统功能的子程序,用户可以调用它们访问Linux内核的数据和函数,这些子程序称为系统调用接口(SCI). ② 系统调用和普通函数的区别:系统调用由操作系统内核实现,运行于内核态:普通函数调用由函数库或用户自己提供,运行于用户态. 3. 系统调用分类:主要分3大类 ①

Linux内核中的软中断、tasklet和工作队列详解

[TOC] 本文基于Linux2.6.32内核版本. 引言 软中断.tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的"下半部"(bottom half)演变而来.下半部的机制实际上包括五种,但2.6版本的内核中,下半部和任务队列的函数都消失了,只剩下了前三者. 介绍这三种下半部实现之前,有必要说一下上半部与下半部的区别. 上半部指的是中断处理程序,下半部则指的是一些虽然与中断有相关性但是可以延后执行的任务.举个例子:在网络传输中,网卡接收到数据包这

Linux内核中的软中断、tasklet和工作队列具体解释

[TOC] 本文基于Linux2.6.32内核版本号. 引言 软中断.tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的"下半部"(bottom half)演变而来. 下半部的机制实际上包含五种,但2.6版本号的内核中.下半部和任务队列的函数都消失了,仅仅剩下了前三者. 介绍这三种下半部实现之前.有必要说一下上半部与下半部的差别. 上半部指的是中断处理程序,下半部则指的是一些尽管与中断有相关性可是能够延后运行的任务. 举个样例:在网络传输中.网卡接收

向linux内核中添加外部中断驱动模块

本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内核中添加外部中断驱动模块.7.完整驱动程序代码.linux的内核版本为linux2.6.32.2. 一.linux模块的框架以及混杂设备相关知识 1.内核模块的框架如下图所示,其中module_init()(图中有误,不是modules_init)只有在使用insmod命令手动加载模块时才会被调用,

(笔记)Linux内核中内存相关的操作函数

linux内核中内存相关的操作函数 1.kmalloc()/kfree() static __always_inline void *kmalloc(size_t size, gfp_t flags) 内核空间申请指定大小的内存区域,返回内核空间虚拟地址.在函数实现中,如果申请的内存空间较大的话,会从buddy系统申请若干内存页面,如果申请的内存空间大小较小的话,会从slab系统中申请内存空间.有关buddy和slab,请参见<linux内核之内存管理.doc> gfp_t flags 的选项

Linux 内核中的 Device Mapper 机制

http://www.68idc.cn/help/server/linux/20141127133367.html 结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物 简介: 本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,