В современных Linux потоки очень похожи на процессы. Каждый поток имеет идентификатор LWP («облегченный процесс»), который внутренне реализован как PID. Однако, если такой «легкий процесс» (то есть поток) запрашивается для PID, система выдает PID процесса, который породил поток (вместо LWP). Также обратите внимание, что если у процесса есть только один поток, его LWP будет равен его PID.
ps
способен обрабатывать потоки с модификатором -L
, как ereOn , описанное в его ответе . Но я должен отметить, что ps
не только для ручного вызова. Он имеет возможность печатать вывод таким образом, чтобы его можно было легко проанализировать с помощью другой программы.
Следующая команда напечатает LWP (-o lwp=
) и PID (-o pid=
) всех (-A
) потоков (-L
) в системе. Каждая строка представляет один поток, второй столбец - процесс, который ее породил:
$ ps -A -L -o lwp= -o pid=
...
27747 27747
27749 27749
27750 27750
27751 27750
27752 27750
27755 27750
27756 27750
27772 27772
27858 27858
30457 30457
30886 30886
Довольно просто разобрать с C или C ++, не так ли? Чтобы фактически прочитать это из вашей программы, вы можете использовать popen
или один из C ++ эквивалентов .
Обратите внимание, что использование ps
не только проще, чем чтение /proc
. Это также намного безопаснее, чем парсинг файловой системы /proc
вручную. ps
- это команда POSIX *, она гарантированно работает; он использует /proc
под Linux, но это внутренние детали. Когда базовая инфраструктура изменится, ps
будет переписан и будет продолжать работать, в то время как ваш код, если он написан на основе /proc
, сломается.
* Если честно, POSIX не указывает -L
переключатель. Но в любом Linux, в котором есть набор инструментов GNU, он будет доступен.