我有一个在 Linux 2.6.13 和 WindRiver Linux 3.0 上运行的应用程序。在 Linux 2.6.13 中,当我...
ps -eaf | grep myapplication
...输出显示“myapplication”的多个条目。
如果我在 WindRiver Linux 3.0 中给出相同的命令,输出只显示一个“myapplication”条目
差异与所使用的操作系统的差异有关吗?请告诉我这是什么原因?
它可能与正在使用的线程库和/或内核版本有关。
旧的(现在非常旧的)“Linuxthreads”线程库,用于将每个线程显示为“顶级”进程,它直接出现在 /proc 下并具有不同的 PID。这是它的许多缺点之一,通过以下方式解决:
新的(现在不是很新的)“NPTL”线程库,多年来一直包含在每个新发行版中,可以使用内核特性使线程出现在相同的 PID 下。线程仍然存在,但现在位于 /proc 中的“task”子目录下,因此通常会被“ps”忽略(如果需要,您仍然可以通过适当的选项看到它们)。
这两个库都实现了 posix 线程 API(或多或少;较新的库比旧的库做的更多)。我希望有问题的进程是多线程的。
如果很久很久以前静态链接的程序,仍然可以看到与 Linuxthreads 链接的程序。现代内核很好地支持这一点。
也许grep myapplication
也列出了,这就是为什么有多个条目。如果没有,这取决于您的应用程序正在做什么,可能会调用自身等。您需要提供更多信息,或者至少是ps -eaf | grep myapplication
输出。
在 Linux 中,线程的实现与完整进程没有太大区别,请参阅man clone
. 我怀疑您只是使用ps
具有不同默认设置的两个不同命令。ps --help
将向您展示如何列出每个进程的每个线程。
您可以使用“ps -efm”列出与其关联的进程和线程。一些系统显示与可执行文件同名的线程。在那里你会看到内核线程显示为“[]”。