我的进程 ID 为 1234。该进程包含线程 ID 1235。
当我使用时,ls -l /proc
我只能看到 pid (1234),但是当我使用打开线程状态文件时,cat /proc/1235/status
我可以看到数据。
这是为什么?
可以直接用tid用C代码访问吗?/proc/1235/mem
不知道进程ID?
答案1
是的,/proc
“包含”线程标识符和进程标识符的目录条目,但只有后者被 枚举getdents
,因此ls
仅显示进程标识符。这在man 5 proc
,在“概述”部分中,因为手册页项目 5.00 版:
/proc/[pid]子目录
这/proc/[pid]迭代时子目录可见/进程和
getdents(2)
(因此当人们使用时可见ls(1)
查看内容/进程)。/proc/[tid]子目录
这/proc/[tid]子目录是不是迭代时可见/进程和
getdents(2)
(因此是不是使用时可见ls(1)
查看内容/进程)。
这是为什么?
我怀疑这是为了保持向后兼容性(对于在 Linux 上以当前形式存在线程之前编写的程序),并限制可伸缩性问题。
可以直接用tid用C代码访问吗?
/proc/1235/mem
不知道进程ID?
是的,如果您知道 tid,则可以/proc/${tid}
直接访问,而无需通过 pid。
如果要枚举线程,可以列出下面的目录条目/proc/${tid}/task/
(这适用于任何线程标识符,而不仅仅是进程标识符)。