본문 바로가기

리눅스 커널/기타

Kernel thread & signal

#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