Linux内核:kthread_create(线程)、SLEEP_MILLI_SEC

2023-10-27 20:50

本文主要是介绍Linux内核:kthread_create(线程)、SLEEP_MILLI_SEC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://blog.csdn.net/guowenyan001/article/details/39230181

 

一、代码

 

[cpp]  view plain copy
  1. #include <linux/module.h>  
  2. #include <linux/kernel.h>  
  3. #include <linux/types.h>  
  4. #include <linux/kthread.h>  
  5. #include <linux/err.h>  
  6.   
  7.   
  8. MODULE_VERSION("1.0.0_0");  
  9. MODULE_LICENSE("GPL");  
  10. MODULE_AUTHOR("gwy");  
  11.   
  12.   
  13.   
  14. #ifndef SLEEP_MILLI_SEC  
  15. #define SLEEP_MILLI_SEC(nMilliSec) \  
  16.     do { \  
  17.         long timeout = (nMilliSec) * HZ /1000; \  
  18.         while (timeout > 0) \  
  19.         { \  
  20.             timeout = schedule_timeout(timeout); \  
  21.         } \  
  22.     }while (0);  
  23. #endif  
  24.   
  25.   
  26. struct task_struct* thread = NULL;  
  27.   
  28. void thread_proc(void* arg)  
  29. {  
  30.     struct timespec ts;    
  31.   
  32.     //set_current_state(TASK_UNINTERRUPTIBLE);  
  33.     while(!kthread_should_stop())  
  34.     {  
  35.         ts = current_kernel_time();    
  36.         printk("thread_proc:%s. time:%ld\n", (char*)arg, ts.tv_sec);  
  37.           
  38.         SLEEP_MILLI_SEC(1000);  
  39.     }  
  40. }  
  41.   
  42. static int init_marker(void)  
  43. {  
  44.     int err;  
  45.   
  46.     printk("init marker.\n");  
  47.   
  48.     thread = kthread_create(thread_proc, "thread arg", "my_thread%d", 0);  
  49.     if (IS_ERR(thread))  
  50.     {  
  51.         err = PTR_ERR(thread);  
  52.         printk("kthread_create fail.\n");  
  53.         return err;  
  54.     }  
  55.   
  56.     wake_up_process(thread);  
  57.   
  58.     printk("thread create.\n");  
  59.   
  60.     return 0;  
  61. }  
  62.   
  63. static void exit_marker(void)  
  64. {  
  65.     if (thread)  
  66.     {  
  67.         kthread_stop(thread);  
  68.         thread = NULL;  
  69.         printk("thread stop.\n");  
  70.     }  
  71.   
  72.     printk("exit marker.\n");  
  73. }  
  74.   
  75.   
  76. module_init(init_marker);  
  77. module_exit(exit_marker);  


二、输出结果

 

三、注意

        1)在调用kthread_stop函数时,线程函数不能已经运行结束。否则,kthread_stop函数会一直进行等待。

        2)线程函数必须能让出CPU,以便能运行其他线程。  同时线程函数也必须能重新被调度运行。

        3)注意线程函数的使用,参见“kthread_create的简单使用”。

 

 

参考资料:

        kthread_create的简单使用:http://blog.csdn.net/newnewman80/article/details/7050090

        kthread_create与kerne_thread的区别:http://blog.sina.com.cn/s/blog_5a1e1b770100jfc0.html

转载于:https://www.cnblogs.com/x_wukong/p/6054420.html

这篇关于Linux内核:kthread_create(线程)、SLEEP_MILLI_SEC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/288319

相关文章

Linux内核定时器使用及说明

《Linux内核定时器使用及说明》文章详细介绍了Linux内核定时器的特性、核心数据结构、时间相关转换函数以及操作API,通过示例展示了如何编写和使用定时器,包括按键消抖的应用... 目录1.linux内核定时器特征2.Linux内核定时器核心数据结构3.Linux内核时间相关转换函数4.Linux内核定时

Linux镜像文件制作方式

《Linux镜像文件制作方式》本文介绍了Linux镜像文件制作的过程,包括确定磁盘空间布局、制作空白镜像文件、分区与格式化、复制引导分区和其他分区... 目录1.确定磁盘空间布局2.制作空白镜像文件3.分区与格式化1) 分区2) 格式化4.复制引导分区5.复制其它分区1) 挂载2) 复制bootfs分区3)

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Linux下屏幕亮度的调节方式

《Linux下屏幕亮度的调节方式》文章介绍了Linux下屏幕亮度调节的几种方法,包括图形界面、手动调节(使用ACPI内核模块)和外接显示屏调节,以及自动调节软件(CaliseRedshift和Reds... 目录1 概述2 手动调节http://www.chinasem.cn2.1 手动屏幕调节2.2 外接显

Linux(centos7)虚拟机没有IP问题及解决方案

《Linux(centos7)虚拟机没有IP问题及解决方案》文章介绍了在CentOS7中配置虚拟机网络并使用Xshell连接虚拟机的步骤,首先,检查并配置网卡ens33的ONBOOT属性为yes,然后... 目录输入查看ZFhrxIP命令:ip addr查看,没有虚拟机IP修改ens33配置文件重启网络Xh

linux实现对.jar文件的配置文件进行修改

《linux实现对.jar文件的配置文件进行修改》文章讲述了如何使用Linux系统修改.jar文件的配置文件,包括进入文件夹、编辑文件、保存并退出编辑器,以及重新启动项目... 目录linux对.jar文件的配置文件进行修改第一步第二步 第三步第四步总结linux对.jar文件的配置文件进行修改第一步进

深入理解Redis线程模型的原理及使用

《深入理解Redis线程模型的原理及使用》Redis的线程模型整体还是多线程的,只是后台执行指令的核心线程是单线程的,整个线程模型可以理解为还是以单线程为主,基于这种单线程为主的线程模型,不同客户端的... 目录1 Redis是单线程www.chinasem.cn还是多线程2 Redis如何保证指令原子性2.

C++实现一个简易线程池的使用小结

《C++实现一个简易线程池的使用小结》在现代软件开发中,多线程编程已经成为提升程序性能的常见手段,本文主要介绍了C++实现一个简易线程池的使用小结,感兴趣的可以了解一下... 在现代软件开发中,多线程编程已经成为提升程序性能的常见手段。无论是处理大量 I/O 请求的服务器,还是进行 CPU 密集型计算的应用

linux ssh如何实现增加访问端口

《linuxssh如何实现增加访问端口》Linux中SSH默认使用22端口,为了增强安全性或满足特定需求,可以通过修改SSH配置来增加或更改SSH访问端口,具体步骤包括修改SSH配置文件、增加或修改... 目录1. 修改 SSH 配置文件2. 增加或修改端口3. 保存并退出编辑器4. 更新防火墙规则使用uf