Linux如何区分线程和子进程?


Answers:


28

从一个task_struct角度来看,一个进程的线程具有相同的线程组领导者(group_leader中的task_struct),而子进程具有不同的线程组领导者(每个单独的子进程)。

此信息暴露给用户空间通过/proc文件系统。您可以通过查看或中的ppid字段来跟踪父母和孩子(这会给父母提供pid)。您可以通过查看中的字段来跟踪线程(这提供了线程组ID,这也是组长的pid)。进程的线程在目录中可见:每个线程都有自己的子目录。(每个进程至少有一个线程。)/proc/${pid}/stat.../statustgid.../status/proc/${pid}/task

实际上,希望跟踪自己的线程的程序将依赖于它们正在使用的线程库提供的API,而不是使用特定于操作系统的信息。通常在类Unix系统上,这意味着使用pthread。


Shell管道中的每个进程(echo foo | cat)共享相同的组长(shell),但它们不是同一进程中的线程。
psusi

2
您在谈论过程组;在我的回答中,组长是从内核的角度来看的。在内核的核算中,单独的进程是它们自己的组长。您可以通过运行(sleep 120 | sleep 120) &并查看Tgid每个sleep进程/proc/${pid}/status文件中的 值来查看此信息。
斯蒂芬·基特

真奇怪 我不知道有没有所谓的“线程组领导者”,我认为多线程进程中的所有线程都是平等的,并且没有“领导者”。他们中的任何一个都可以退出,只要剩下一个,这个过程就不会结束。
psusi '18 -4-2

5
  1. 这会运行top命令并提供一些其他选项:

    top -H -b -n 1
    
    • -H参数指示top显示每个单独的线程。通常,top总结其父进程下的所有线程。
    • -b参数使top在批处理模式下运行-信息被收集,显示,然后转储到stdout,而不是在交互模式下运行并刷新显示的数据。
    • 使用该-b选项时,用户必须告诉top运行多少次,这是通过-n参数完成的,最后一个参数是运行多少次。

    因此,top -H -b -n 1指示系统“运行顶部,显示单个线程,以批处理模式运行,并且仅运行一次”。

  2. ps命令报告当前正在运行的进程的快照。

    ps -eLf
    

    -eLf参数(也可以使用-e -L -f)分解如下:

    • e告诉ps显示所有进程,而不管谁拥有它们或它们的当前状态如何-活动,睡眠,暂停,等待I / O等。
    • L告诉ps显示各个线程
    • f讲述ps来格式化的输出作为全格式列表,并且在结合L的NLWP(线程数)和LWP(线程ID)列被添加到输出参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.