LINUX.ORG.RU

... struct task_struct *pp; pp = &init_task;

spin_lock(&task_lock); for(;;){ printk(KERN_ALERT "%s - [%d]\n",pp->comm, pp->pid); if(pp->pid != 0 && pp->pid != 1) { pid[i] = pp->pid; i++; } pp = list_entry((pp)->tasks.next, struct task_struct, tasks); if(pp == &init_task) break; } spin_unlock(&task_lock); ... Удачи!!!

anonymous
()
Ответ на: комментарий от anonymous

...
   struct task_struct *pp;
   pp = &init_task;

   spin_lock(&task_lock);
   for(;;){
      printk(KERN_ALERT "%s - [%d]\n",pp->comm, pp->pid);
        if(pp->pid != 0 && pp->pid != 1)
          { pid[i] = pp->pid; i++; }
            
      pp = list_entry((pp)->tasks.next, struct task_struct, tasks);
      if(pp == &init_task) break;
    }
    spin_unlock(&task_lock);
...
Удачи!!!

anonymous
()
Ответ на: комментарий от anonymous

> spin_lock(&task_lock);

хмм.... может, tasklist_lock ? и к тому же read_lock().

> for(;;){
> ...
> if(pp == &init_task) break;

лучше for_each_process(pp)

idle ★★★★★
()
Ответ на: комментарий от idle

> хмм.... может, tasklist_lock ? и к тому же read_lock().
Вот с этим я согласен.
> лучше for_each_process(pp)
а это тоже самое.

anonymous
()
Ответ на: комментарий от cvv

> челу как-будто нужен юзерспейс а вы всё ядро да ядро

верно :) а я сразу ответы стал читать.

ничего кроме чтения /proc/ для этого еще не придумали.

Ok, есть еще способ:

    int pid_max; // читаем из /proc/sys/kernel/pid_max

    for (int pid = 1; pid < pid_max; ++pid)
            if (kill(pid, 0) && errno == ESRCH)
                    play_with_process_found(pid);


хотел уже отправить... но ведь, блин, обязательно найдется
кто-то, кто вслух усомнится в эффективности такого подхода.

короче - шутка.

idle ★★★★★
()
Ответ на: комментарий от cvv

> по моемому эта штука потребует рутовых прав

нет, почему же? мы могли бы даже любой сигнал посылать
вместо 0, если бы не опасность погубить свои собственные
процессы. обратите внимание, мы проверяем на ESRCH (только
должно быть "!=", конечно).

иными словами, это в принципе работает под любым пользователем.

idle ★★★★★
()
Ответ на: комментарий от idle

>    if (kill(pid, 0) && errno == ESRCH)

должно быть:

     if (!kill(0, pid) || errno != ESRCH)

или

     if (!kill(0, pid) || errno == EPERM)

idle ★★★★★
()
Ответ на: комментарий от idle

>иными словами, это в принципе работает под любым пользователем.

да вы правы. мне почемуто показалось что kill не от рута на чужой процесс вернёт ESRCH а не EPERM.

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.