编写Linux内核模块时获取用户进程pid

14 c linux kernel-module

如何获取触发我的内核模块file_operation.read例程的用户进程的PID (即哪个进程正在读取/dev/mydev)?

cni*_*tar 20

当您的读取函数正在执行时,它正在发出系统调用的进程的上下文中执行此操作.因此你应该能够使用current,即current->pid.

  • @ 0x90这是一个宏. (2认同)

Yas*_*oji 9

这些天,我们在sched.h中定义了一些辅助函数.在pid的情况下,您可以使用:

pid = task_pid_nr(current);
Run Code Online (Sandbox Code Playgroud)

获取当前任务的pid.

这是从include/linux/sched.hv3.8开始的评论.

帮助者从各种命名空间中看到任务的不同pid

  • task_xid_nr():全局id,即从init命名空间看到的id;
  • task_xid_vnr():虚拟标识,即从当前的pid名称空间看到的标识.
  • task_xid_nr_ns():从指定的ns看到的id;
  • set_task_vxid():为任务分配虚拟ID;

另见include/linux/pid.h中的pid_nr()等


min*_*hua 5

在内核 2.6.39 arm 构建上,如果current->pid不起作用,则可以通过以下方式完成:

    pid_nr(get_task_pid(current, PIDTYPE_PID))
Run Code Online (Sandbox Code Playgroud)

可以PIDTYPE_PIDPIDTYPE_PGID或代替PIDTYPE_SIDinclude/linux/pid.h正如 Yasushi 指出的那样,标头来源位于。

哪种方法有效取决于代码使用的头文件。