在内核开发或者驱动开发过程中,不可避免需要使用较长循环的代码处理,尤其是内核代码中有很多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