Количество запущенных процессов в системе Minix из кода C - PullRequest
3 голосов
/ 29 августа 2011

Итак, сначала это казалось простым, но после сканирования Google и здесь, ответ не кажется таким простым, как я сначала подумал.

По сути, я редактирую ядро ​​MINIX как часть практического курса по моим операционным системам, и мне нужно добавить небольшую функцию, которая подскажет количество запущенных процессов при нажатии функциональной клавиши на информационном сервере. Я выяснил, как интегрировать функциональность, чтобы все остальные вещи работали, но я не могу понять, как получить текущее число процессов, работающих в системе, в мой код на C и переменную для распечатать.

Сначала я подумал, что будет отличный Syscall, такой как SYS_NUMPROCS, или что-то, что вернет значение, но не повезло. Затем я попытался скопировать вывод из системы ("ps -ax | wc -l") в файл, и файл не был создан. Я попытался использовать popen (), и мне тоже не повезло - даже при простом считывании «ls» в буфер, он просто бомбит код и «вешает» прогон кода, поэтому вывода нет.

Так что теперь я по-настоящему озадачен, и любая помощь будет очень крутой, потому что на данный момент я исчерпал все очевидные варианты.

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

Спасибо за стек (смеется), ребята:)

Кроме того, я не включил код в явном виде, потому что ничего, что я написал, кроме базового printf'ing для косметического вывода, потому что ничего из того, что я пробовал, не доставило мне радости: /

Редактирование заметок: Ребята, это редактирование ядра - я пишу функцию для печати информации в системном файле C, затем перекомпилирую ядро ​​и перезагружаю систему для тестирования. Это ядро ​​UNIX (MINIX), а не ядро ​​Linux, и это не программа пользовательского режима.

Мой код для popen (), как некоторые из вас просили, выглядит следующим образом:

public void cos_dmp(){
    char buffer[512];
    FILE * f;

    f = popen("ps -ax | wc -l","r");

    fgets(buffer, sizeof(buffer),f);

  //buffer should now contain result of popen()

     printf(buffer);
}

Это немного взломанная версия из того, что я помню, я держу ее как можно более простой и показываю вам, ребята, это то, что я пытался сделать. Опять же, однако, должен быть лучший способ сделать это, кроме того, чтобы по существу вызывать выходные данные вызова system ().

Снова отредактируйте: приведенный выше код прекрасно работает из пользовательской программы, но не работает из функции ядра. У кого-нибудь есть идеи, почему?: /

Ответы [ 8 ]

3 голосов
/ 29 августа 2011

Возможно, вы могли бы показать нам код, который вы написали для получения результата system("ps -ax | wc -l"), или код, который вы написали для использования popen, и мы могли бы помочь вам диагностировать проблему с ним.

Несмотря на это, самый эффективный способ подсчета количества существующих (не совпадающих с запущенными) процессов в системе - это opendir("/proc") и подсчет количества записей, которые являются строками десятичных цифр. Каждый процесс в системе будет представлен подкаталогом / proc , названным в честь десятичного идентификатора процесса этого процесса.

Итак, если вы найдете, например, «/ proc / 3432», то вы знаете, что существует процесс с pid «3432». Просто посчитайте количество подкаталогов, которые вы найдете, чьи имена являются десятичными числами.

<ч /> Допущения:

  • Вы спрашиваете о Linux , а не MINIX .
  • Вы пишете программу в пользовательском режиме, а не модифицируете ядро.
3 голосов
/ 29 августа 2011

попробуйте посмотреть, что делает PS. Посмотрите на его исходный код; он знает, сколько процессов

2 голосов
/ 03 сентября 2011
struct kinfo kinfo;
int nr_tasks, nr_procs;
getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo);
nr_procs = kinfo.nr_pro;

Это даст вам количество запущенных процессов

1 голос
/ 17 сентября 2015

У меня было такое же задание в моем университете, поэтому я опубликую свое решение, если кому-то оно понадобится в будущем.Я использую Minix 3.3 и проигрыватель VMware для виртуальных машин.
В pm сервер в расположении / usr / src / minix / servers / pm есть glo.h файл, который содержит различные глобальные переменные, используемые сервером pm.В этом файле, к счастью, есть одна переменная с именем procs_in_use , определенная как EXTERN int procs_in_use;
Такой простой printf("%d\n",procs_in_use); из системного вызова покажет количество запущенных текущих процессов.Вы можете проверить это, добавив функцию fork() в вашу пользовательскую программу в середине цикла.

Еще одно упоминание: первый ответ, который говорит, что

struct kinfo kinfo;
int nr_tasks, nr_procs;
getsysinfo(PM_PROC_NR, SI_KINFO, &kinfo);
nr_procs = kinfo.nr_procs;

не сработал для меня.SI_KINFO больше не существует, поэтому вы должны использовать SI_PROC_TABLE.Также могут быть проблемы с разрешениями, поэтому вы не сможете вызывать эту функцию из своего обычного системного вызова.Существует альтернативная функция sys_getkinfo(&kinfo), которая может быть вызвана из вашего свежего системного вызова и будет выполнять те же действия, что и выше.Проблема в том, что kinfo.nr_procs не будет возвращать количество текущих процессов, а максимальное количество пользовательских процессов, которое может быть в операционной системе (по умолчанию 256) и может быть изменено вручную в файле, где определено NR_PROCS.С другой стороны, kinfo.nr_tasks вернет максимальное количество процессов ядра, которое может удерживать оперативная система, которое по умолчанию равно 5.

1 голос
/ 25 августа 2014

Итак, у меня возникла та же проблема, и я нашел решение. (MINIX 3.1) в методе для подсчета процессов используйте этот код: (Это ANSI C)

Он просто пробегает таблицу процессов и считает количество процессов.

Я знаю, что это старая ветка, но она может кому-то помочь в будущем.

#include "../pm/mproc.h"

/* inside function */

struct mproc *mp;
int i, n=0;

printf("Number of running processes:\n");

getsysinfo(PM_PROC_NR, SI_PROC_TAB, mproc);

for (i = 0; i<NR_PROCS; i++) {
    mp = &mprocs[i];
    if (mp->mp_pid == 0 && i != PM_PROCS_NR) continue;
    n++;   
}

printf("%d", n);

/* function end */
0 голосов
/ 07 декабря 2014

Проверьте это: http://sourceforge.net/p/readproc/code/ci/master/tree/

#include"read_proc.h"
int main(void)
{
     struct Root * root=read_proc();
     printf("%lu\n",root->len);
     return 0;
}
0 голосов
/ 29 августа 2011

Если вы редактируете ядро, самый эффективный способ решить эту проблему - поддерживать счетчик каждый раз, когда создается процесс (т. Е. Запись task_struct) (и убедитесь, что вы уменьшаете счетчик каждый раз, когда процесс завершается ).

Вы всегда можете просмотреть список процессов в ядре, используя встроенный макрос (но он дорогой, поэтому вам следует избегать его):

struct task_struct *p;
unsigned int count = 0;
for_each_process(task) {
    count++;
}
0 голосов
/ 29 августа 2011

Проверьте это: http://procps.sourceforge.net/

У него есть множество небольших утилит, которые делают подобные вещи.Это будет хороший опыт обучения :) и я думаю, что PS там, как отметил pm100.

...