Страница 1 из 1

Вывод на экран процессов с четным PID

Добавлено: 19 сен 2013, 11:38
hereticms
Помогите пожалуйста с решением следующей задачи:
Нужно со стандартного потока ввода получить список всех активных процессов и вывести на экран только процессы с четными PID.
Т.е. команда для запуска программы такая
ps -A -o pid, fname | ./main
Очень срочно нужно. Использовать можно только функции read() и write().

Re: Вывод на экран процессов с четным PID

Добавлено: 30 сен 2013, 18:33
Romeo
Так как вывод команды ps передаётся через пайп в нашу программу, то мы сможем его прочитать в нашей программе из стандартного потока ввода. Для этого в качестве дескриптора файла в функцию read следует передать специально зарезервированную константу STDIN_FILENO:

Код: Выделить всё

#define BUFF_SIZE 2048
...
char buff[BUFF_SIZE];
int n = read(STDIN_FILENO, buff, BUFF_SIZE);
После этого осталось только распарсить прочитанную строку. Делаем это примерно так:
0. Текущая позиция - начало строки.
1. Двигаем текущую позицию, пропуская лидирующие пробелы и табы.
2. Если дошли до конца строки - выход.
3. Запоминаем позицию первого непробельного символа.
4. Двигаем текущую позицию, пытаясь обнаружить первый пробельный символ (пробел или таб) после запомненной позиции.
5. Если дошли до конца строки, то считаем первым пробельным символом конец строки, иначе считаем первым пробельным символом найденный пробельный символ.
6. Копируем подстроку от позиции найденной в пункте 3 до позиции найденной в пунтке 5 (не включая конец).
7. Полученное строковое представление числа переводим в число (например с помощью atol).
8. Определяем чётное ли это число и если да, то выводим его в стандартный поток вывода.
9. Если текущая позиция достигла конца строки, то конец алгоритма, иначе переходим на пункт 1.