0

Linux ワークキューについて質問があります。workqueue を使用したカーネルモジュールの例を見つけてテストしました。これがコードです。

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/workqueue.h>
#include <linux/slab.h>

MODULE_LICENSE( "GPL" );

static struct workqueue_struct *my_wq;

typedef struct {
    struct work_struct my_work;
    int    x;
} my_work_t;

my_work_t *work, *work2;


static void my_wq_function( struct work_struct *work)
{
    my_work_t *my_work = (my_work_t *)work;

    printk( "my_work.x %d", my_work->x );

    kfree( (void *)work );

    return;
}

static int __init init_workqueue( void )
{
    int ret;

    my_wq = create_workqueue("my_queue");
    if (my_wq) {

        /* Queue some work (item 1) */
        work = (my_work_t *)kmalloc(sizeof(my_work_t), GFP_KERNEL);
        if (work) {

            INIT_WORK( (struct work_struct *)work, my_wq_function );

            work->x = 1;

            ret = queue_work( my_wq, (struct work_struct *)work );

        }

        /* Queue some additional work (item 2) */
        work2 = (my_work_t *)kmalloc(sizeof(my_work_t), GFP_KERNEL);
        if (work2) {

            INIT_WORK( (struct work_struct *)work2, my_wq_function );

            work2->x = 2;

            ret = queue_work( my_wq, (struct work_struct *)work2 );

        }

    }

    return 0;
}

static void __exit exit_workqueue( void )
{
    flush_workqueue( my_wq );
    destroy_workqueue( my_wq );

    return;
}

module_init(init_workqueue)
module_exit(exit_workqueue)

そしてこれが結果です。左が入力内容、右がdmesgです。work2 の printk が表示されない理由がわかりません。

work.x 2 が表示されない

モジュールを再挿入すると、モジュールが表示されます。

変

キューに入れられた作業から printk メッセージを取得するにはどうすればよいですか?

4

1 に答える 1

0

への呼び出しprintk()は改行文字 ( \n) で終わらないためdmesg、次の呼び出しでカーネル メッセージ バッファーに新しいエントリが追加されるまで何も出力されません。

次のように、フォーマット文字列の最後に改行を追加するだけです。

printk("my_work.x %d\n", my_work->x);
//                  ^^
于 2020-04-30T14:41:05.867 に答える