私は次のカーネルモジュールを書いた:
#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()
改行文字がフラッシュされないようです。dmesg
printk()
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, ¶1, "t1");
// Oops, something went wrong(such as failing to create another kthread)
ret = kthread_stop(t1);
これはfunc
実行されずにktheard_stop
返されます-EINTR
。