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

时间:2012-08-11 14:58:58

标签: c linux kernel-module

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

3 个答案:

答案 0 :(得分:16)

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

答案 1 :(得分:7)

现在,我们在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 :(得分:2)

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

    pid_nr(get_task_pid(current, PIDTYPE_PID))

PIDTYPE_PID可以由PIDTYPE_PGIDPIDTYPE_SID代替。 Yasushi指出,标题源位于include/linux/pid.h

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