Tim*_*Tim 25 linux process thread
Linux 实际上并不区分进程和线程,而是将两者都实现为一种数据结构task_struct。
那么,Linux 为某些程序提供了什么来让它们从子进程中区分进程的线程?例如,有没有办法查看进程在 Linux 中拥有的所有线程的详细信息?
谢谢。
Ste*_*itt 32
从一个task_struct角度来看,进程的线程具有相同的线程组领导(group_leaderintask_struct),而子进程具有不同的线程组领导(每个单独的子进程)。
此信息暴露给用户空间通过的/proc文件系统。您可以通过查看or中的ppid字段来跟踪父母和孩子(这给出了父 pid);您可以通过查看中的字段来跟踪线程(这给出了线程组 ID,它也是组长的 pid)。进程的线程在目录中可见:每个线程都有自己的子目录。(每个进程至少有一个线程。)/proc/${pid}/stat.../statustgid.../status/proc/${pid}/task
在实践中,希望跟踪自己线程的程序将依赖于它们正在使用的线程库提供的 API,而不是使用特定于操作系统的信息。通常在类 Unix 系统上,这意味着使用 pthread。
这会运行top带有一些额外选项的命令:
top -H -b -n 1
Run Code Online (Sandbox Code Playgroud)
-H参数指示 top 显示每个单独的线程。通常 top 汇总其父进程下的所有线程。-b参数使 top 以批处理模式运行——信息被收集、显示,然后转储到标准输出,而不是在交互模式下运行并刷新显示的数据。-b选项,用户必须告诉 top 运行多少次,这是通过-n参数和最终参数完成的运行次数。Sotop -H -b -n 1指示系统“运行顶部,显示单个线程,以批处理模式运行,并且只运行一次”。
该ps命令报告当前正在运行的进程的快照。
ps -eLf
Run Code Online (Sandbox Code Playgroud)
该-eLf参数(可作为-e -L -f以及)分解如下:
e告诉ps显示所有进程,无论谁拥有它们或它们的当前状态——活动、睡眠、暂停、等待 I/O 等。L告诉ps显示单个线程f讲述ps来格式化的输出作为全格式列表,并且在结合L的NLWP(线程数)和LWP(线程ID)列被添加到输出参数。