Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Вывод процессов и потоков на С


Автор: wast 14.5.2009, 11:11
Народ, помогите плз, как на С выводить инфу о запущенных процессах и их потоках? какие вызовы и библиотеки нужно использовать?

Автор: bilbobagginz 14.5.2009, 12:13
всё просто. в линукс есть программа ps.
она выводит всё что тебе надо.
скачай ее исходники, и посмотри как она это делает.
удачи.


Автор: nickless 14.5.2009, 17:58
Для вопросов по программированию под никсами у нас есть специальный раздел.

Модератор: Тема перенесена из http://forum.vingrad.ru/forum/Linux-Unix-common-questions.html

Автор: xvr 15.5.2009, 14:10
man 5 proc

Автор: wast 15.5.2009, 19:48
да, я читал про /proc/ , но про потоки ни слова... может кто-нить сталкивался с ними?

Автор: xvr 15.5.2009, 20:52
Цитата(wast @ 15.5.2009,  19:48)
да, я читал про /proc/ , но про потоки ни слова... может кто-нить сталкивался с ними?

Потоки в Linux выглядят как процессы (каковыми и являются). Так что для каждого потока в /proc/ есть своя дира

Автор: MAKCim 15.5.2009, 22:14
Цитата(xvr @  15.5.2009,  20:52 Найти цитируемый пост)
Так что для каждого потока в /proc/ есть своя дира

нет  smile 

в /proc только лидер threads group

Добавлено через 1 минуту и 4 секунды
Цитата(xvr @  15.5.2009,  20:52 Найти цитируемый пост)
Потоки в Linux выглядят как процессы (каковыми и являются).

c т. з структур данных ядра

Автор: xvr 16.5.2009, 10:08
Цитата(MAKCim @ 15.5.2009,  22:14)
Цитата(xvr @  15.5.2009,  20:52 Найти цитируемый пост)
Так что для каждого потока в /proc/ есть своя дира

нет  smile 

в /proc только лидер threads group

Нету сейчас под рукой Linux'а, но когда я на него смотрел в последний раз в /proc/ было все, включая все thread'ы (специально проверял)
Возможно сиё зависит от версии ядра (или от погоды на марсе  smile )
PID'ы thread'ов у 'лидер threads group' были где то перечислены
Дойду до работы - гляну

Автор: MAKCim 16.5.2009, 11:04
Цитата(xvr @  16.5.2009,  10:08 Найти цитируемый пост)
но когда я на него смотрел в последний раз в /proc/ было все, включая все thread'ы (специально проверял)

ух, давно ты смотрел  smile 


Цитата(xvr @  16.5.2009,  10:08 Найти цитируемый пост)
Возможно сиё зависит от версии ядра

ну в 2.4 реализации NPTL не было, поэтому POSIX threads были реализованы в как linux threads (т. е pthread_create()->clone(CLONE_VM | CLONE_FS | ...))
начиная с 2.6 в libc по-умолчанию используется NPTL (т. е pthread_create()->clone(CLONE_THREAD))
однако остается возможность использования linux threads семантики с помощью LD_ASSUME_KERNEL

Добавлено через 3 минуты и 18 секунд
я тоже слегка нагнал
инфа есть, но не в /proc, а в /proc/<PID>/task, PID - лидер threads group

Автор: wast 17.5.2009, 10:27
т.е. нити надо искать в pid/task ? а лидер threads group это какбы сам процес? тогда скажите где лежат исходники ps и проч или какую документацию смотреть? (у меня openSuse 11)

Автор: MAKCim 18.5.2009, 08:50
Цитата(wast @  17.5.2009,  10:27 Найти цитируемый пост)
тогда скажите где лежат исходники ps

http://procps.sourceforge.net/

Автор: xvr 18.5.2009, 15:31
Дошел до работы, проверил:

Код

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

#include <sys/types.h>
#include <linux/unistd.h>
 
_syscall0(pid_t,gettid)

void* th(void*)
{
 printf("TID=%d\n",gettid());
 sleep(120);
 return NULL;
}

int main()
{
 printf("PID=%d\n",getpid());
 for(int i=0;i<3;++i)
  {
   pthread_t tid;
   pthread_create(&tid,NULL,th,NULL);
   sleep(1);
  }
 sleep(120);
 return 0;
}

Результат:
Цитата

[rakhvato@msteplxl13 ~]$ ./threads &
[1] 19152
[rakhvato@msteplxl13 ~]$ PID=19152
TID=19153
TID=19154
TID=19155
 
[rakhvato@msteplxl13 ~]$ ls -l /proc/19152/task/
total 0
dr-xr-xr-x  3 rakhvato cmplr 0 May 18 16:14 19152
dr-xr-xr-x  3 rakhvato cmplr 0 May 18 16:14 19153
dr-xr-xr-x  3 rakhvato cmplr 0 May 18 16:14 19154
dr-xr-xr-x  3 rakhvato cmplr 0 May 18 16:14 19155

[rakhvato@msteplxl13 ~]$ ls -ld /proc/19153
dr-xr-xr-x  3 rakhvato cmplr 0 May 18 16:14 /proc/19153

[rakhvato@msteplxl13 ~]$ ls -ld /proc/19154
dr-xr-xr-x  3 rakhvato cmplr 0 May 18 16:14 /proc/19154

[rakhvato@msteplxl13 ~]$ ls -ld /proc/19155
dr-xr-xr-x  3 rakhvato cmplr 0 May 18 16:14 /proc/19155

[rakhvato@msteplxl13 ~]$ uname -a
Linux msteplxl13 2.6.9-42.ELsmp #1 SMP Wed Jul 12 23:32:02 EDT 2006 x86_64 x86_64 x86_64 GNU/Linux

Так что входы в /proc есть для всех нитей, f не только для лидера thread group

Автор: MAKCim 18.5.2009, 20:44
Цитата(xvr @  18.5.2009,  15:31 Найти цитируемый пост)
Так что входы в /proc есть для всех нитей, f не только для лидера thread group

 smile 
Цитата(MAKCim @  16.5.2009,  11:04 Найти цитируемый пост)
я тоже слегка нагнал
инфа есть, но не в /proc, а в /proc/<PID>/task, PID - лидер threads group


Автор: xvr 18.5.2009, 21:28
Цитата(MAKCim @ 18.5.2009,  20:44)
Цитата(xvr @  18.5.2009,  15:31 Найти цитируемый пост)
Так что входы в /proc есть для всех нитей, f не только для лидера thread group

 smile 
Цитата(MAKCim @  16.5.2009,  11:04 Найти цитируемый пост)
я тоже слегка нагнал
инфа есть, но не в /proc, а в /proc/<PID>/task, PID - лидер threads group

Не
Цитата

но не в /proc, а в /proc/<PID>/task
а
Цитата

и в /proc, и в /proc/<PID>/task


Автор: MAKCim 18.5.2009, 22:24
xvr, 
неа
по крайней мере у меня
Цитата

Linux rei3er 2.6.27.7-default #2 SMP Wed Dec 31 20:38:18 EET 2008 x86_64 x86_64 x86_64 GNU/Linux

в /proc ничего нет

меня смущает версия твоего ядра, уж больно оно старое, не linuxthreads ли там используются?
можно strace проги threads?

Автор: xvr 19.5.2009, 12:17
Цитата(MAKCim @ 18.5.2009,  22:24)
xvr, 
неа
по крайней мере у меня
Цитата

Linux rei3er 2.6.27.7-default #2 SMP Wed Dec 31 20:38:18 EET 2008 x86_64 x86_64 x86_64 GNU/Linux

в /proc ничего нет

Угу, значит возможны варианты  smile 
Цитата

можно strace проги threads?
Можно (но не весь - слишком много мусора)
Цитата

clone(TID=4169
child_stack=0x41e02270, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID|CLONE_DETACHED, parent_tidptr=0x41e029f0, tls=0x41e02960, child_tidptr=0x41e029f0) = 4169

Автор: wast 22.5.2009, 22:23
всем спс, мне хватило readdir /proc и /proc/<PID>/tasks , тему наверн лучше закрыть, а то скоро все ядро распотрошат))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)