kthread를 올바르게 생성하고 중지하는 방법은 무엇입니까?

kthread를 올바르게 생성하고 중지하는 방법은 무엇입니까?

나는 다음 커널 모듈을 작성했습니다:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/semaphore.h>
#include <linux/spinlock.h> 
     
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Madhuparna Bhowmik <[email protected]>");
MODULE_DESCRIPTION("Example for using threads");
    
static struct task_struct *t1;
static struct task_struct *t2;

static int t1_f(void *unused)
{
    printk(KERN_INFO "Current value in t1 is %d",7);
    do_exit(0);
    return 0;
}

static int t2_f(void *unused)
{
    printk(KERN_INFO "Current value in t2 is %d",8);
    do_exit(0);
    return 0;
}

static int __init start_init(void)
{
    printk(KERN_INFO "Thread Creating...\n");
    t1 = kthread_run(t1_f,NULL,"mythread1");
    t2 = kthread_run(t2_f,NULL,"mythread2");
    
    return 0;
}

static void __exit end_exit(void)
{
    printk(KERN_INFO "Cleaning Up...\n");
}

    
module_init(start_init)
module_exit(end_exit)

다음을 사용하여 이 모듈을 로드할 때:

sudo insmod test1.ko

kern.log 파일을 확인하면 다음과 같은 결과가 나타납니다.

Oct  8 00:24:13 madhuparna-VirtualBox kernel: [ 5752.075918] Thread creating ...

Oct  8 00:24:13 madhuparna-VirtualBox kernel: [ 5752.076009] Current value in t1 is 7

스레드 2에는 아직 로그가 없습니다.

실행한 후:

sudo rmmod test1.ko

로그는 다음과 같습니다

Oct  8 00:24:13 madhuparna-VirtualBox kernel: [ 5752.075918] Thread creating ...
Oct  8 00:24:13 madhuparna-VirtualBox kernel: [ 5752.076009] Current value in t1 is 7
Oct  8 00:24:54 madhuparna-VirtualBox kernel: [ 5752.077780] Current value in t2 is 8
Oct  8 00:24:54 madhuparna-VirtualBox kernel: [ 5793.099359] Cleaning up ...

그렇다면 내가 rmmod를 실행하고 커널을 언로드할 때까지 스레드 2가 실행되지 않는 이유를 누군가 설명할 수 있습니까? 왜 thread1만 실행되나요?

답변1

의 끝에 개행 문자를 추가해야 합니다 printk(). 다른 문자가 그렇지 않을 때까지 printk()개행 문자가 플러시되지 않는 것 같습니다 .dmesgprintk()KERN_CONT

printk(KERN_INFO "Current value in t1 is %d\n",7);
printk(KERN_INFO "Current value in t2 is %d\n",8);

kthread를 올바르게 생성하고 중지하는 방법에 대해 제가 작성한 샘플 코드는 다음과 같습니다. 도움이 되길 바랍니다. https://gist.github.com/seekstar/4bdef2a775383d417e265317832e44ed

사용 이유 struct completion entered: https://stackoverflow.com/questions/65987208/kthread-stopped-without-running

다음 방법으로 스레드를 취소할 수 있습니다.

t1 = kthread_create(func, &para1, "t1");
// Oops, something went wrong(such as failing to create another kthread)
ret = kthread_stop(t1);

이렇게 하면 func실행되지 않고 ktheard_stop반환됩니다 -EINTR.

관련 정보