Linux实际上并不区分进程和线程,而是将两者实现为数据结构task_struct。
那么,Linux为某些程序提供了哪些功能,以使其从子进程中得知进程的线程?例如,是否可以查看Linux中某个进程具有的所有线程的详细信息?
谢谢。
Linux实际上并不区分进程和线程,而是将两者实现为数据结构task_struct。
那么,Linux为某些程序提供了哪些功能,以使其从子进程中得知进程的线程?例如,是否可以查看Linux中某个进程具有的所有线程的详细信息?
谢谢。
Answers:
从一个task_struct角度来看,一个进程的线程具有相同的线程组领导者(group_leader中的task_struct),而子进程具有不同的线程组领导者(每个单独的子进程)。
此信息暴露给用户空间通过的/proc文件系统。您可以通过查看或中的ppid字段来跟踪父母和孩子(这会给父母提供pid)。您可以通过查看中的字段来跟踪线程(这提供了线程组ID,这也是组长的pid)。进程的线程在目录中可见:每个线程都有自己的子目录。(每个进程至少有一个线程。)/proc/${pid}/stat.../statustgid.../status/proc/${pid}/task
实际上,希望跟踪自己的线程的程序将依赖于它们正在使用的线程库提供的API,而不是使用特定于操作系统的信息。通常在类Unix系统上,这意味着使用pthread。
(sleep 120 | sleep 120) &并查看Tgid每个sleep进程/proc/${pid}/status文件中的 值来查看此信息。
这会运行top命令并提供一些其他选项:
top -H -b -n 1
-H参数指示top显示每个单独的线程。通常,top总结其父进程下的所有线程。-b参数使top在批处理模式下运行-信息被收集,显示,然后转储到stdout,而不是在交互模式下运行并刷新显示的数据。-b选项时,用户必须告诉top运行多少次,这是通过-n参数完成的,最后一个参数是运行多少次。因此,top -H -b -n 1指示系统“运行顶部,显示单个线程,以批处理模式运行,并且仅运行一次”。
该ps命令报告当前正在运行的进程的快照。
ps -eLf
该-eLf参数(也可以使用-e -L -f)分解如下:
e告诉ps显示所有进程,而不管谁拥有它们或它们的当前状态如何-活动,睡眠,暂停,等待I / O等。L告诉ps显示各个线程f讲述ps来格式化的输出作为全格式列表,并且在结合L的NLWP(线程数)和LWP(线程ID)列被添加到输出参数。 考虑一个带有PID p1的过程
task_struct子进程的对象的PPID(父PID)为p1,其PID和TGID设置为p2。
task_structp1线程的对象将PID设置为p3,但TGID设置为p1。