在内核开发或者驱动开发过程中,不可避免需要使用较长循环的代码处理,尤其是内核代码中有很多for(;;)获取while(1)循环 等待硬件或者某个条件触发才能退出循环,这样做其实是非常危险,如果退出条件长期达不到条件,就会一直死循环下去,直接卡住整个内核或者某个驱动模块,即使在用户层发送control +c 信号,内核层也无法补捉退出循环

为了解决上述,为了解决死循环导致卡死问题,能够在内核层捕获control+ c信号,内核开发一系列接口fatal_signal_pending/signal_pending用于在内核层能够捕获control +信号

fatal_signal_pending/signal_pending

fatal_signal_pending/signal_pending()接口为内核提供用于捕捉信号接口,一般在开发驱动中为了防止死循环卡死内核,可以使用上述接口用于捕获KILL信号,例如使用方法如下:

while(!fatal_signal_pending(current) {// infinite loop
}

用于捕获用户向当前进程发送的signal信号,在内核代码尤其是驱动代码中有大量循环中使用该方法防止各种异常导致无法终止现象,例如ext4文件系统中ext4_readdir()函数:


static int ext4_readdir(struct file *file, struc

linux内核那些事之fatal_signal_pending/signal_pending/cond_resched相关推荐

  1. linux内核那些事之buddy(慢速申请内存__alloc_pages_slowpath)(5)

    内核提供__alloc_pages_nodemask接口申请物理内存主要分为两个部分:快速申请物理内存get_page_from_freelist(linux内核那些事之buddy(快速分配get_p ...

  2. linux内核那些事之buddy(anti-fragment机制)(4)

    程序运行过程中,有些内存是短暂的驻留 用完一段时间之后就可以将内存释放以供后面再次使用,但是有些内存一旦申请之后,会长期使用而得不到释放.长久运行有可能造成碎片.以<professional l ...

  3. linux内核那些事之pg_data_t、zone结构初始化

    free_area_init 继续接着<linux内核那些事之ZONE>,分析内核物理内存初始化过程,zone_sizes_init()在开始阶段主要负责对各个类型zone 大小进行计算, ...

  4. linux内核那些事之mmap_region流程梳理

    承接<linux内核那些事之mmap>,mmap_region()是申请一个用户进程虚拟空间 并根据匿名映射或者文件映射做出相应动作,是实现mmap关键函数,趁这几天有空闲时间 整理下mm ...

  5. linux内核那些事之buddy

    buddy算法是内核中比较古老的一个模块,很好的解决了相邻物理内存碎片的问题即"内碎片问题",同时有兼顾内存申请和释放效率问题,内核从引入该算法之后一直都能够在各种设备上完好运行, ...

  6. linux内核那些事之Sparse vmemmap

    <inux内核那些事之物理内存模型之SPARCE(3)>中指出在传统的sparse 内存模型中,每个mem_section都有一个属于自己的section_mem_map,如下图所示: 而 ...

  7. linux内核那些事之buddy(anti-fragment机制-steal page)(5)

    继<linux内核那些事之buddy(anti-fragment机制)(4)>,在同一个zone内指定的migrate type中没有足够内存,会启动fallback机制,从fallbac ...

  8. linux内核那些事之Memory protection keys(硬件原理)

    mprotect/map原理及缺陷 <linux 关于虚拟内存的几个系统调用>,提及到用户程序可以通过mprotect或者map(MAP_FIXED)系统调用可以根据需要再次修改已经申请过 ...

  9. linux内核那些事之mmap

    <linux mmap系统调用>主要描述了用户空间内mmap的使用及其注意事项,mmap最终还是要进入到内核态,如果没有指定addr则由内核分配一段可用的vma,如果已经指定addr则内核 ...

最新文章

  1. thinkphp5.1 中间件是什么有什么用
  2. Windows Mobile 5.0 设备的目录变化
  3. 比特币现金是银行的一种补充
  4. python excel合并_Python把多个Excel合并成一个Excel
  5. 全局静态存储区、堆区和栈区深入剖析
  6. 【Github】怎么在README.md中添加图片?
  7. linux 运行程序的方法,linux 长期运行程序的 四种方法
  8. php用date表示本月,用php获取本周,上周,本月,上月,本季度日期的代码
  9. [转]优化MySQL数据库性能的八大“妙手”
  10. Java权限管理系统完整案例
  11. (附源码)学生社团管理系统app 毕业设计 191850
  12. 机械工业设计中常见三维软件大盘点
  13. 阿里云 服务网格 ASM
  14. 互联网+创新创业大赛反思总结
  15. 谷歌翻译SDK (Google Translate SDK)的使用
  16. 李智慧 - 架构师训练营 第五周
  17. 华为推送 简介 集成
  18. unity2D:无限跳跃bug和卡墙bug处理
  19. 经典论文推导: As-Rigid-As-Possible(ARAP) Surface Modeling
  20. 基于Reworld、Roblox的团队协作

热门文章

  1. libevent php教程,PHP环境安装libevent扩展
  2. 《国富论》简摘 谢祖钧版
  3. Vulkan教程 - 06 交换链
  4. Android模拟键盘和键盘监听
  5. java上安装zookeeper并且实现增删改查
  6. 浅谈智能小车的控制策略
  7. “双十一”背后的隐形战场:电商后台IT技术大检阅
  8. 【MySQL】三大范式(设计理念、优点、不足之处)
  9. 总结Vue第一天~简单介绍、基本知识、辅助函数和js数组的高阶函数
  10. Bandizip Archiver——新秀解压压缩工具!