Linux カーネル モジュールのコードを書いていますが、奇妙な動作を経験しています。これが私のコードです:
int data = 0;
void threadfn1()
{
int j;
for( j = 0; j < 10; j++ )
printk(KERN_INFO "I AM THREAD 1 %d\n",j);
data++;
}
void threadfn2()
{
int j;
for( j = 0; j < 10; j++ )
printk(KERN_INFO "I AM THREAD 2 %d\n",j);
data++;
}
static int __init abc_init(void)
{
struct task_struct *t1 = kthread_run(threadfn1, NULL, "thread1");
struct task_struct *t2 = kthread_run(threadfn2, NULL, "thread2");
while( 1 )
{
printk("debug\n"); // runs ok
if( data >= 2 )
{
kthread_stop(t1);
kthread_stop(t2);
break;
}
}
printk(KERN_INFO "HELLO WORLD\n");
}
基本的に、スレッドが終了するのを待ってから、その後何かを印刷しようとしていました。上記のコードはその目標を達成しますが、WITH"printk("debug\n");"
はコメントされていません。コメントアウトしprintk("debug\n");
てデバッグなしでコードを実行し、insmod コマンドを使用してモジュールをロードするとすぐに、モジュールがハングアップし、再帰で失われたように見えます。printk が私のコードにそれほど大きな影響を与えるのはなぜですか?
どんな助けでも大歓迎です。
よろしく。