カーネルモジュールのfile_operation.read
ルーチンをトリガーしたユーザープロセスのPIDを取得するにはどうすればよいですか(つまり、どのプロセスが/dev/mydev
を読み取っていますか)。
読み取り関数が実行されているときは、システムコールを発行したプロセスのコンテキストで実行されています。したがって、current
、つまりcurrent->pid
を使用できるようにする必要があります。
最近、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()なども参照してください。
カーネル2.6.39armビルドで、current->pid
が機能しない場合は、次の方法で実行できます。
pid_nr(get_task_pid(current, PIDTYPE_PID))
PIDTYPE_PID
はPIDTYPE_PGID
またはPIDTYPE_SID
に置き換えることができます。 Yasushiが指摘したように、ヘッダーソースはinclude/linux/pid.h
にあります。
どのアプローチが機能するかは、コードが使用するヘッダーファイルによって異なります。