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

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

当您的读取功能正在执行时,它正在发出系统调用的过程中执行此操作。 你应该能够使用current ,即current->pid

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

 pid = task_pid_nr(current); 

获取当前任务的pid。

这里是从include/linux/sched.h开始的include/linux/sched.h中的注释。

帮助者从各种命名空间中看到任务的不同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.39 arm构建上,如果current->pid不起作用,那么可以这样做:

  pid_nr(get_task_pid(current, PIDTYPE_PID)) 

PIDTYPE_PID可以由PIDTYPE_PGIDPIDTYPE_SID 。 头文件的源文件位于include/linux/pid.h正如Yasushi所指出的那样。

哪个方法工作取决于代码使用的头文件。