web-dev-qa-db-ja.com

Linuxカーネルモジュールを作成するときにユーザープロセスpidを取得する

カーネルモジュールのfile_operation.readルーチンをトリガーしたユーザープロセスのPIDを取得するにはどうすればよいですか(つまり、どのプロセスが/dev/mydevを読み取っていますか)。

15
user1592383

読み取り関数が実行されているときは、システムコールを発行したプロセスのコンテキストで実行されています。したがって、current、つまりcurrent->pidを使用できるようにする必要があります。

19
cnicutar

最近、sched.hで定義されているいくつかのヘルパー関数があります。 pidの場合、次を使用できます。

pid = task_pid_nr(current);

現在のタスクのpidを取得します。

これが include/linux/sched.h v3.8以降。

さまざまな名前空間から見たタスクのさまざまなpidを取得するヘルパー

  • task_xid_nr():グローバルID、つまりinit名前空間から見たID。
  • task_xid_vnr():仮想ID、つまり現在のpid名前空間から見たID。
  • task_xid_nr_ns():指定されたnsから見たID。
  • set_task_vxid():仮想IDをタスクに割り当てます。

include/linux/pid.hのpid_nr()なども参照してください。

9
Yasushi Shoji

カーネル2.6.39armビルドで、current->pidが機能しない場合は、次の方法で実行できます。

    pid_nr(get_task_pid(current, PIDTYPE_PID))

PIDTYPE_PIDPIDTYPE_PGIDまたはPIDTYPE_SIDに置き換えることができます。 Yasushiが指摘したように、ヘッダーソースはinclude/linux/pid.hにあります。

どのアプローチが機能するかは、コードが使用するヘッダーファイルによって異なります。

4
minghua