Помогите пожалуйста с решением следующей задачи:
Нужно со стандартного потока ввода получить список всех активных процессов и вывести на экран только процессы с четными PID.
Т.е. команда для запуска программы такая
ps -A -o pid, fname | ./main
Очень срочно нужно. Использовать можно только функции read() и write().
Вывод на экран процессов с четным PID
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Так как вывод команды ps передаётся через пайп в нашу программу, то мы сможем его прочитать в нашей программе из стандартного потока ввода. Для этого в качестве дескриптора файла в функцию read следует передать специально зарезервированную константу STDIN_FILENO:
После этого осталось только распарсить прочитанную строку. Делаем это примерно так:
0. Текущая позиция - начало строки.
1. Двигаем текущую позицию, пропуская лидирующие пробелы и табы.
2. Если дошли до конца строки - выход.
3. Запоминаем позицию первого непробельного символа.
4. Двигаем текущую позицию, пытаясь обнаружить первый пробельный символ (пробел или таб) после запомненной позиции.
5. Если дошли до конца строки, то считаем первым пробельным символом конец строки, иначе считаем первым пробельным символом найденный пробельный символ.
6. Копируем подстроку от позиции найденной в пункте 3 до позиции найденной в пунтке 5 (не включая конец).
7. Полученное строковое представление числа переводим в число (например с помощью atol).
8. Определяем чётное ли это число и если да, то выводим его в стандартный поток вывода.
9. Если текущая позиция достигла конца строки, то конец алгоритма, иначе переходим на пункт 1.
Код: Выделить всё
#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.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.