[cdev] Задание ps
Grigoriy A. Sitkarev
sinclair80 на gmail.com
Вс Мар 14 04:25:48 MSK 2010
Соображения по поводу ps у меня такие.
1. Мне не нравилось что у вас там развёрнутый массив и выход из
ситуации на мой взгляд в использовании другой форматной строки в
fscanf/sscanf.
Если включить после `%' модификатор `*' то запись аргумента
подавляется. Таким образом можно пропустить те поля, которые нам не
нужны. Если вы ознакомились со спецификацией Open Group то обратили
внимание что используется ограниченное количество полей, и не вся
информация, которая есть в /proc/<PID>/stat нам нужна.
F, S, UID, PID, PPID, C, PRI, NI, ADDR, SZ, WCHAN, STIME, TTY, TIME,
CMD - все поля описаны в спецификации, и обратите внимание, что в
круглых скобках дополнительно указано когда это поле нужно отображать.
Некоторые поля отображаются всегда, некоторые только если указаны
опции -f или -l.
Значит из stat нам нужны следующие поля:
flags, state, pid, ppid, priority, nice, kstkeip, rss, vsize, comm,
utime, stime.
Я мог что-то пропустить или забыть, потом разберёмся.
С полем WCHAN отдельная тема, чтобы оно работало нужно ядро собирать с
опцией компилятора, которая сохраняет кадр стека. Вам можно там пока
просто чёрточку `-' ставить. Потом доделаем, если что.
Одного вызова fscanf/sscanf должно быть достаточно, просто у вас
форматная строка получится подлиннее, например "%d %u %*lu %*lu %*lu"
и т.п. Сами разберётесь, как она должна выглядеть, с учётом
пропускаемых полей.
2. Нужно выводить время, затраченное CPU, суммарное, у нас есть поля в
jiffies для времени в режиме ядра и в режиме пользователя (utime,
stime). Их надо суммировать. Эти единицы не в секундах а в тиках
таймера ядра, если ядро делает 100 прерываний в секунду, то один
jiffie это 10 миллисекунд. Сколько тиков будет в секунду, задаётся при
сборке ядра - есть такой макрос HZ (от единицы измерения частоты -
Герц) и параметр в конфигурации ядра CONFIG_HZ. Определять сколько
тиков в секунду нужно самому, способов я думаю есть минимум два:
а) Смотреть в /proc/irq/0/spurious в поле count и замерять сколько
будет прерываний, заснув на 100 миллисекунд например в nanosleep(2).
После чего, считав заново это поле, вычислить количество тиков в
секунду.
б) Через gettimeofday(2) и times(2), замерять сколько времени пройдёт
между соседними тиками. Функция times(2) возвращает количество тиков,
прошедших с определённого момента времени.
Может быть есть ещё варианты.
3. Хотелось бы иметь опции -l и -f как минимум. Очень желаетельно бы
ещё и опцию -o увидеть, которая задаёт формат отображения. Задание
интересное, с практической точки зрения.
Время уже позднее, замечания по коду есть, днём напишу.
--
Г.А.
14 марта 2010 г. 0:24 пользователь Grigoriy A. Sitkarev
<sinclair80 на gmail.com> написал:
> Я выберу оттуда наиболее важные и употребимые опции и вы их
> реализуете. Надеюсь что этот труд доставит вам удовольствие.
>
> Так держать.
> 13 марта 2010 г. 23:47 пользователь ka50 <astroori на mail.ru> написал:
>> Жду дальнейших рекомендаций и указаний по реализации задания.
Подробная информация о списке рассылки cdev