2010-11-08 14 views
5

Pytam o Linuksa z najnowszym glibc.Linux: wykryj w czasie wykonywania, że ​​proces ma wiele wątków.

Czy istnieje sposób wykrywania tego procesu składający się z 1 wątku lub kilku wątków?

Wątki mogą być tworzone przez pthread lub bare clone(), więc potrzebuję czegoś bardziej uniwersalnego.

UPD: Chcę wykryć wątki bieżącego procesu z niego samego.

+0

W ramach własnego programu lub zewnętrznie? – Duck

+0

Kaczka, w ramach mojego programu. – osgx

+0

Muszę zapytać: dlaczego jeszcze nie wiesz? Czy biblioteka lub takie otwieranie ich pod kołdrą? – Duck

Odpowiedz

11

Sprawdź, czy katalog/proc/YOUR_PID/task/zawiera tylko jeden podkatalog. Jeśli masz więcej niż jeden wątek w procesie, pojawi się kilka podkatalogów.

Do zliczania podkatalogów można użyć liczby hardlink. Funkcja ta zwraca bieżącą liczbę wątków:

#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

Hmm ... Tak. Istnieją wątki dla niektórych procesów. Ale żeby uzyskać informacje z/proc, potrzebuję wielu systemów operacyjnych: opendir/readdir. Czy jest jakiś prostszy sposób? – osgx

+1

@osgx: Możesz to zrobić z jedną syscall - po prostu 'stat ("/proc/self/task ")' i sprawdź, czy 'st_nlink> 3'. – caf

+0

caf, Dzięki, ale czy procfs utrzymuje liczbę dowiązań i-węzłów dla dir? Czy sprawdzasz tę metodę? – osgx

0

Przypuszczam, że można uruchomić „ps” (przez popen() lub podobny) i analizować swoje wyjście i zobacz, ile razy ID procesu (jak zwrócony przez getpid()) pojawia się na wyjściu. Może być lepszy sposób, ale to właśnie przychodzi na myśl.

+0

NIE, proszę, nie ma żadnego podprocesu startującego :). Jest tak powolny i potrzebuję szybkiej metody, takiej jak 1 syscall lub trochę czytania flag. – osgx

0

/proc jest standardowym sposobem wykonania tej czynności w systemie Linux. Narzędzia takie jak "ps" działają poprzez/proc. W Linuksie 2.6 można znaleźć liczbę wątków w/proc/self/stat, ale to nie jest kompatybilne wstecz.

0

Odpowiedź od Victora jest z pewnością najszybsza, chociaż warto rozważyć użycie biblioteki ps.

Nazwa, pod Ubuntu jest libprocps3-dev więc użyć go zainstalować przy użyciu:

sudo apt-get install libprocps3-dev 

Nagłówki znajdują się pod /usr/include/proc.

Należy pamiętać, że biblioteka działa poprzez czytanie/proc. Jest to więc to samo, co bezpośrednie czytanie interesujących plików, tylko że będzie wiedział o różnicach między różnymi wersjami i zajmie się tym pod maską dla ciebie.

Aby uzyskać szczegółowe informacje, patrz http://procps.sourceforge.net/index.html.

+0

Ile połączeń systemowych wykona procps, aby odpowiedzieć na pytanie "proces składa się z 1 wątku lub więcej niż 1 wątku"? – osgx

+1

Na głównej odpowiedzi widzę, że wiele osób pyta o problem ze zgodnością. procps jest zdecydowanie powolny, ale powinien działać transparentnie na nowszych i starszych wersjach Linuksa. Zależy to od tego, czy potrzebujesz szybkości, czy długoterminowej kompatybilności. –

Powiązane problemy