博文

目前显示的是标签为“signal”的博文

内核线程同步之signal

对于内核线程,尤其是在同一模块里有多个时,我们想终止其中一个,而又不想卸载模块,此时signal就帮上我们一个大忙了,在设计时让线程接收信号并处理,想停止时发信号给它,而在内核里需要用到如下信号相关函数: 1.signal_pending 在Linux内核源码include/linux/sched.h文件里,有如下函数定义: static inline int signal_pending(struct task_struct *p) { return unlikely(test_tsk_thread_flag(p,TIF_SIGPENDING)); } 该函数用于判断指定线程有没有接收到信号,即信号有没有被阻塞。 上面的参数我们一般是判断当前线程,故而会乃至include/asm-generic/current.h里的current宏,定义如下: #define current get_current() 2.allow_signal 在Linux内核源码kernel/exit.c有该函数的实现,而在include/linux/sched.h文件里有如下声明: extern int allow_signal(int); 其参数是SIGKILL等宏,在include/uapi/asm-generic/signal.h文件中有相应的宏定义。 内核线程允许接收信号后,还需要确保该线程是可打断的,需要用到如下宏: 1.set_current_state 在include/linux/sched.h文件中有如下宏定义: #define set_current_state(state_value) \ set_mb(current->state, (state_value)) 2.TASK_INTERRUPTIBLE 在同一头文件中如下宏定义: #define TASK_INTERRUPTIBLE 1 上面两个宏结合使用用于配置当前线程的状态是可被中断的。 接下来上代码吧: #include <linux/module.h> #include <linux/kthread.h> #include <linux/delay.h> static struct task_...