Linux: обнаружение во время выполнения, что процесс имеет несколько потоков - PullRequest
5 голосов
/ 08 ноября 2010

Я спрашиваю о Linux с недавним glibc.

Есть ли способ обнаружить этот процесс, состоящий из 1 потока или нескольких потоков?

Потоки могут быть созданы с помощью pthread, илиbare clone (), поэтому мне нужно что-то довольно универсальное.

UPD: я хочу обнаружить потоки текущего процесса из самого него.

Ответы [ 4 ]

11 голосов
/ 08 ноября 2010

Проверьте, содержит ли каталог / proc / YOUR_PID / task / только один подкаталог.Если у вас более одного потока в процессе, будет несколько подкаталогов.

Счетчик жестких ссылок может использоваться для подсчета подкаталогов.Эта функция возвращает текущее количество потоков:

#include <sys/stat.h>

int n_threads(void)
{
    struct stat task_stat;

    if (stat("/proc/self/task", &task_stat))
        return -1;

    return task_stat.st_nlink - 2;
}
0 голосов
/ 01 июня 2015

Ответ от Виктора, безусловно, самый быстрый, хотя вы можете использовать библиотеку ps.

Имя в Ubuntu libprocps3-dev, поэтому вы можете установить его, используя:

sudo apt-get install libprocps3-dev

Заголовки находятся под /usr/include/proc.

Обратите внимание, что библиотека работает путем чтения / proc. Таким образом, это то же самое, что и чтение файлов, представляющих интерес напрямую, только он будет знать о различиях между различными версиями и позаботится об этом под капотом.

Подробнее см. http://procps.sourceforge.net/index.html.

0 голосов
/ 08 ноября 2010

/ proc - это стандартный способ сделать это в Linux. Инструменты типа 'ps' работают через / proc. В Linux 2.6 вы можете найти количество потоков в / proc / self / stat, но это не имеет обратной совместимости.

0 голосов
/ 08 ноября 2010

Полагаю, вы могли бы запустить 'ps' (через popen () или аналогичную) и проанализировать его вывод и посмотреть, сколько раз идентификатор вашего процесса (возвращаемый getpid ()) появляется в выходных данных. Возможно, есть лучший способ, но это то, что приходит на ум первым.

...