kthreadsを使用して補完を適切に実装するにはどうすればよいですか?

UndergroundCoding

kthreadで補完を実装するカーネルモジュールを書き込もうとしています。

私がコーディングしようとしているロジックは次foo()のとおりbar()です。はkthreadを作成しますfoo()呼び出しwait_for_completion()て、スレッドbar()が終了するのを待ちます。bar()本体を実行してから、complete()直前に呼び出しますreturn()foo()は残りのコードを最後まで続行します。

コードの抜粋は次のとおりです。

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/completion.h>
#include <linux/kthread.h>
#include <net/tcp.h>

//A couple of standard descriptions
MODULE_LICENSE("GPL");

//Struct used to pass kthread args
typedef struct {
    int side;       //Specify motor side
    int direction;      //Specify motor rotation direction
    struct completion wait_for_motor;   //completion struct
} kthread_arg;

//kthread struct declaration
static struct task_struct *left_motor;

static int motor_rotate(void* data) {
    //Cast and dereference argument structure
    kthread_arg in = *(kthread_arg*)data;

    int i = in.side;
    printk(KERN_NOTICE "Module: motor side=%d\n",i);
    printk(KERN_NOTICE "Module: Completing kthread...\n");

    //Signal completion
    complete(&(in.wait_for_motor));

    printk(KERN_NOTICE "Module: Kthread Completed.\n"); 

    return 0;
}

//Init function
static int main_init(void)
{
    /*  Body of code */

    //Initialize argument structures;
    static kthread_arg kta_left_motor;

    //Set motor side
    kta_left_motor.side = 0;

    //Initialize completion
    init_completion(&kta_left_motor.wait_for_motor);

    //Create and run kthread
    left_motor = kthread_run(&motor_rotate, (void*)&kta_left_motor, "motor_rotate_0");

    printk(KERN_NOTICE "Module: Wait_for_completion...\n");

    //Put function to sleep until kthread signals completion
    wait_for_completion(&(kta_left_motor.wait_for_motor));

    printk(KERN_NOTICE "Module: Completion done.\n");

    /*  More function calls and code    */

    return 0;
}

//Exit function
static void leave_exit(void)
{
    printk(KERN_INFO "Exit module.\n");
}

module_init(main_init);
module_exit(leave_exit);

ここでkern.log出力は:

Module: Wait_for_completion...
Module: motor side=0
Module: Completing kthread...
Module Kthread Completed.

親関数がウェイクアップされることはなく、行に到達しないことに注意してくださいprintk(KERN_NOTICE "Module: Completion done.\n");このコードを実行すると、モジュールがハングします。

完了ドキュメントを上から下まで約100回読みましたが、を使用してcomplete_all()done(常に0を出力する)の値を確認し、を使用completion_done()try_wait_for_completion()て成功しませんでした。

上で説明した目標を達成するためのより良い方法があるかどうかはわかりません。

私は補完の実装を削除した場合、完全に私は親関数があることを見つけるfoo()常に完了まで実行される前に、すべてのkthreadsが稼働し始める私が必要とするためであるのに対し、foo()のみ実行するようにした後 、すべてのkthreadsの実行が行われます。

Ubuntu

uname -r: 4.10.0-42-generic

ヘラクレスdd

motor_rotate()以下に示すように変更します。

  1. kthread_arg *in = (kthread_arg *) data;
  2. int i = in->side;
  3. complete(&(in->wait_for_motor));

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

zsh補完をBash補完のように動作させるにはどうすればよいですか?

分類Dev

Angular 4を使用してコンポーネントにMouseEventをより適切に実装するにはどうすればよいですか?

分類Dev

Docker / Kubenertesを使用してPythonを適切に実行するにはどうすればよいですか?

分類Dev

ValidatorとControlValue Accessorを使用してネストされたフォームを適切に実装するにはどうすればよいですか?

分類Dev

flutter --bloc --UiでFutureBuilderを使用してBlocアーキテクチャを適切に実装するにはどうすればよいですか?

分類Dev

Pythonでn分岐係数を使用してツリーを適切に実装するにはどうすればよいですか?

分類Dev

OSGi宣言型サービスを使用してサーブレットを適切に実装するにはどうすればよいですか?

分類Dev

Angularルートパラメータを使用してユニットテストを適切に実装するにはどうすればよいですか?

分類Dev

PyTorchを使用してデータの再編成を適切に実装するにはどうすればよいですか?

分類Dev

ファイル名に対してbashにvimのようなタブ補完を実行させるにはどうすればよいですか?

分類Dev

TypeScriptを使用して、クラスに適切な関数仕様を実装させるにはどうすればよいですか?

分類Dev

Joi検証を使用して適切な参照ロジックを実装するにはどうすればよいですか?

分類Dev

Scipyおよび1D配列を使用してN次元補間の値を適切に再形成するにはどうすればよいですか?

分類Dev

タブ補完にすべてのPIDを含めるにはどうすればよいですか?

分類Dev

すべてのzsh自動補完を一覧表示するにはどうすればよいですか?

分類Dev

ズーム画像をより適切に実装するにはどうすればよいですか?

分類Dev

awaitMessagesを含むループを適切に実装するにはどうすればよいですか?

分類Dev

CSS内のiframeにmargin-leftを適切に実装するにはどうすればよいですか?

分類Dev

MeteorにBootstrapカルーセルを適切に実装するにはどうすればよいですか?

分類Dev

Midnight Commanderでコマンドライン補完を使用するにはどうすればよいですか?

分類Dev

AngularでDOM操作を適切に実装するにはどうすればよいですか?

分類Dev

磁力計を使用してジャイロz軸に補完フィルターを追加するにはどうすればよいですか?

分類Dev

Atomizrを使用してAtomスニペットをSublimeText補完に変換するにはどうすればよいですか?

分類Dev

scipyを使用して2次元補間を実行するにはどうすればよいですか?

分類Dev

タブ補完を使用して、コマンドラインで相対パスを展開するにはどうすればよいですか?

分類Dev

タブ補完を使用して、コマンドラインで相対パスを展開するにはどうすればよいですか?

分類Dev

Spring Converterを適切に実装するにはどうすればよいですか?

分類Dev

ListIteratorの中間モデルを適切に実装するにはどうすればよいですか?

分類Dev

無料の製品を適切に実装するにはどうすればよいですか?

Related 関連記事

  1. 1

    zsh補完をBash補完のように動作させるにはどうすればよいですか?

  2. 2

    Angular 4を使用してコンポーネントにMouseEventをより適切に実装するにはどうすればよいですか?

  3. 3

    Docker / Kubenertesを使用してPythonを適切に実行するにはどうすればよいですか?

  4. 4

    ValidatorとControlValue Accessorを使用してネストされたフォームを適切に実装するにはどうすればよいですか?

  5. 5

    flutter --bloc --UiでFutureBuilderを使用してBlocアーキテクチャを適切に実装するにはどうすればよいですか?

  6. 6

    Pythonでn分岐係数を使用してツリーを適切に実装するにはどうすればよいですか?

  7. 7

    OSGi宣言型サービスを使用してサーブレットを適切に実装するにはどうすればよいですか?

  8. 8

    Angularルートパラメータを使用してユニットテストを適切に実装するにはどうすればよいですか?

  9. 9

    PyTorchを使用してデータの再編成を適切に実装するにはどうすればよいですか?

  10. 10

    ファイル名に対してbashにvimのようなタブ補完を実行させるにはどうすればよいですか?

  11. 11

    TypeScriptを使用して、クラスに適切な関数仕様を実装させるにはどうすればよいですか?

  12. 12

    Joi検証を使用して適切な参照ロジックを実装するにはどうすればよいですか?

  13. 13

    Scipyおよび1D配列を使用してN次元補間の値を適切に再形成するにはどうすればよいですか?

  14. 14

    タブ補完にすべてのPIDを含めるにはどうすればよいですか?

  15. 15

    すべてのzsh自動補完を一覧表示するにはどうすればよいですか?

  16. 16

    ズーム画像をより適切に実装するにはどうすればよいですか?

  17. 17

    awaitMessagesを含むループを適切に実装するにはどうすればよいですか?

  18. 18

    CSS内のiframeにmargin-leftを適切に実装するにはどうすればよいですか?

  19. 19

    MeteorにBootstrapカルーセルを適切に実装するにはどうすればよいですか?

  20. 20

    Midnight Commanderでコマンドライン補完を使用するにはどうすればよいですか?

  21. 21

    AngularでDOM操作を適切に実装するにはどうすればよいですか?

  22. 22

    磁力計を使用してジャイロz軸に補完フィルターを追加するにはどうすればよいですか?

  23. 23

    Atomizrを使用してAtomスニペットをSublimeText補完に変換するにはどうすればよいですか?

  24. 24

    scipyを使用して2次元補間を実行するにはどうすればよいですか?

  25. 25

    タブ補完を使用して、コマンドラインで相対パスを展開するにはどうすればよいですか?

  26. 26

    タブ補完を使用して、コマンドラインで相対パスを展開するにはどうすればよいですか?

  27. 27

    Spring Converterを適切に実装するにはどうすればよいですか?

  28. 28

    ListIteratorの中間モデルを適切に実装するにはどうすればよいですか?

  29. 29

    無料の製品を適切に実装するにはどうすればよいですか?

ホットタグ

アーカイブ