#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/signal.h>
#include <linux/sched/signal.h>
static struct task_struct * ts = NULL;
static int ts_routine(void * ptr)
{
unsigned long remain;
allow_signal(SIGUSR1);
while (1)
{
remain = msleep_interruptible(5000); //signal을 기다리면서 ms동안 sleep
if (kthread_should_stop()) //쓰레드 종료 요청을 받는 함수
break;
printk("wake up, remain time: %lums\n", remain);
}
printk("remain time: %lums\n", remain);
return 0;
}
int sig_init (void)
{
ts = kthread_run(ts_routine, NULL, "test_thread"); //쓰레드 생성 및 실행(ready q)
return 0;
}
void sig_cleanup(void)
{
if (ts)
{
send_sig(SIGUSR1, ts, 0); //해당 task_struct에 시그널을 전송
kthread_stop(ts); //스레드 종료를 요청
}
}
module_init(sig_init);
module_exit(sig_cleanup);
MODULE_LICENSE("GPL");
커널 쓰레드는 자체적으로 시그널을 처리한다.
그래서 처리할 시그널을 allow_signal()을 통해 명시하여야 한다.
실제로 ts_routine()에서 allow_signal()을 실행시키지 않으면,
sig_cleanup()에서 send_sig()로 시그널을 보내도 msleep_interruptible()함수가 바로 종료되지 않고, 명시한 시간이 다 끝날 때 까지 기다리고 있음을 확인 할 수 있다.
'리눅스 커널 > 기타' 카테고리의 다른 글
dmesg console output (0) | 2021.10.28 |
---|---|
칼리 리눅스 커널 컴파일 시 에러에 관해 (0) | 2021.10.28 |
Kernel wait queue (0) | 2021.10.21 |
Device file (0) | 2021.10.21 |
Kernel module compile (0) | 2021.10.21 |