如何获取触发我的内核模块的file_operation.read
例程的用户进程的PID(即哪个进程正在读取/dev/mydev
)?
答案 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_PGID
或PIDTYPE_SID
代替。 Yasushi指出,标题源位于include/linux/pid.h
。
哪种方法有效取决于代码使用的头文件。