Список всех потоков в текущем процессе?

Я пытаюсь реализовать системный вызов, который позволяет мне получить количество потоков для текущего процесса. Я новичок в ядре Linux, и поэтому мое понимание этого ограничено.

В настоящее время я пытаюсь перебрать всеtask_structs, и сравните их лидера группы темs PID с текущим лидером группы потоков 's PID:

// ...
int nthreads = 0;
struct task_struct *task_it;
for_each_process(task_it) {
    if (task_it->group_leader->pid == current->group_leader->pid) {
        nthreads++;
    }
}
// ...

Тем не менее, это некажется, работает (быстрый тест порождает некоторые pthreads по-прежнему дает1, Что насчетgroup_leader является общим для всех потоков в одном процессе?

 Ilya Matveychikov22 окт. 2012 г., 16:52
 R..21 окт. 2012 г., 23:40
не было бы/proc/$pid/task/ работать, чтобы найти, сколько потоков в процессе?

Ответы на вопрос(2)

Следующая C-программа создает список всех процессов в таблице процессов узла и показывает в одном столбце количество потоков для любого отдельного процесса. Используя этот инструмент, можно было определить, что сетевой демон создает новый поток каждый раз, когда возникает проблема с сетью. Серьезная проблема сети была ответственна за проблемы входа в систему.

#include "sys/param.h"
#include "sys/pstat.h"

int main ( void )
{

  struct pst_status * psa = NULL;   
  struct pst_status * prc = NULL;    
  struct pst_dynamic  psd;
  long                nproc = 0;      
  long                thsum = 0;       
  long                i;                

  if ( pstat_getdynamic(&psd, sizeof(psd), 1, 0) == -1 )
    (void)perror("pstat_getdynamic failed");

  // Get the number of active processes from pst_dynamic 
  nproc  = psd.psd_activeprocs;  
  psa    = (struct pst_status *)malloc(nproc * sizeof(struct pst_status));

  // Read the info about the active processes into the array 'psa' 
  if ( pstat_getproc(psa, sizeof(struct pst_status), nproc, 0) == -1 )
    (void)perror("pstat_getproc failed");

  (void)printf("\n\n------------------------------------------------------------------------------");
  (void)printf("\n %5s | %5s |%7s| %5s | %s", "PID", "UID", "Threads", "RSS", "Command");
  (void)printf("\n------------------------------------------------------------------------------");

  // Report the process info as required
  prc = (struct pst_status *)psa;       
  for (i=0; i < nproc; i++) 
  {
    (void)printf("\n %5ld | ", prc->pst_pid);
    (void)printf("%5ld | ", prc->pst_uid);
    (void)printf("%5ld | ", prc->pst_nlwps);
    (void)printf("%5ld | ", prc->pst_rssize);
    (void)printf("%s ", prc->pst_cmd);
    thsum += prc->pst_nlwps;
    ++prc;         
  } 

  (void)printf("\n\n*** %ld processes, %ld threads running\n\n", nproc, thsum);
  (void)free(psa);       
  (void)exit(0);
} 

Нашел здесь:http://h21007.www2.hp.com/portal/site/dspp/menuitem.863c3e4cbcdc3f3515b49c108973a801?ciid=060818f70fe0211018f70fe02110275d6e10RCRD

Вот'Еще одна ссылка с использованием task_struct:http://tuxthink.blogspot.com/2011/03/using-foreachprocess-in-proc-entry.html

 davepmiller22 окт. 2012 г., 00:20
Хорошо, нашел другую ссылку, которая использует task_struct. Смотрит на то, что тебе нужно. Я добавил ссылку в решении выше. Удачи :)
 Casey Kuball22 окт. 2012 г., 00:14
Можно ли сделать это через task_struct (s) вместо использованияpstat_getproc функционировать?
Решение Вопроса

pid полеtask_struct) это то, что пользовательское пространство называет TID (т.е.с чемс возвращеноsys_gettid() и является уникальным для каждой темы). То, что пользовательское пространство называет PID, называется TGID в ядре (дляидентификатор группы задач ") - тот'с чемsys_getpid() системный вызов возвращается.

Ты нене нужно фактически проверять TGID - просто сравниваяstruct task_struct * указателей достаточно:

if (task_it->group_leader == current->group_leader) {

Кстати, вы можете просто перебратьthread_group перечислите этоcurrent является членом (сwhile_each_thread()), то вы бы неТебе вообще не нужен тест. Или даже лучше, просто используйте.get_nr_threads(current)

Обратите внимание, что все методы, которые зацикливаются на списках задач, должны быть заключены в /rcu_read_lock();rcu_read_unlock(); чтобы быть правильным.

Ваш ответ на вопрос