2010-11-08 4 views
5

Я спрашиваю о Linux с недавним glibc.Linux: обнаружить во время выполнения, что процесс имеет несколько потоков

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

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

UPD: Я хочу определить потоки текущего процесса из него.

+0

В вашей собственной программе или извне? – Duck

+0

Duck, В моей программе. – osgx

+0

Я должен спросить: почему бы вам не знать? Является ли библиотека или ее открытие под обложками? – Duck

ответ

11

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

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

#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

Хм ... Да. Есть потоки для некоторых процессов. Но для получения информации из/proc мне нужно много системных вызовов: opendir/readdir. Есть ли более простой способ? – osgx

+1

@osgx: Вы можете сделать это с помощью одного syscall - просто 'stat ("/proc/self/task ")' и проверить, есть ли 'st_nlink> 3'. – caf

+0

caf, Спасибо, но поддерживает ли procfs количество ссылок inode для dirs? Вы проверяете этот метод? – osgx

0

Я полагаю, вы можете запустить «пс» (через POPEN() или аналогичный) и разобрать его выход, и сколько раз ID вашего процесса (который возвращается GETPID()). Там может быть лучший способ, но это то, что первое приходит на ум.

+0

НЕТ, пожалуйста, никаких подпроцессов, начиная :). Это так медленно, и мне нужен быстрый способ, например, 1 syscall или некоторый флаг для чтения или так. – osgx

0

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

0

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

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

sudo apt-get install libprocps3-dev 

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

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

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

+0

Сколько системных вызовов будет выполнять procps для ответа на вопрос «процесс состоит из 1 потока или более одного потока»? – osgx

+1

В основном ответе, я вижу, что многие люди спрашивают о проблеме совместимости. procps определенно медленный, но должен работать прозрачно в более новых и более старых версиях Linux. Это зависит от того, нужна ли вам скорость или долгосрочная совместимость. –

Смежные вопросы