Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/30: Рейтинг темы: голосов - 30, средняя оценка - 4.77
94 / 95 / 13
Регистрация: 10.10.2008
Сообщений: 606
1

Получить список всех активных процессов

15.09.2013, 20:31. Показов 6298. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Народ необходимо написать программу получающую со стандартного потока ввода список всех активных процессов и вывести на экран процессы с четным PID. Заранее всем спасибо
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.09.2013, 20:31
Ответы с готовыми решениями:

Как вывести список всех активных процессов пользователя?
#!/bin/bash echo "Enter name>" read name if ; then STRING=$(ps -all user) echo $STRING else...

Как получить список всех процессов?
Привет всем не подкажете как получить список всех процессов(не только запущенных).А потом чтобы...

Получить список активных пользователей.
Всем привет. Может и проскакивала такая тема, но не нашёл её. Интересует ответ на вопрос: Как...

Найти список всех активных дисков через GetLogicalDriveStrings
Здравствуйте. Необходимо найти список всех активных дисков через GetLogicalDriveStrings. Накидал...

10
alex_x_x
15.09.2013, 20:47
  #2

Не по теме:

а чем

Bash
1
ps aux | awk '{ if (! ($2 % 2)) print }'
не угодил?

0
94 / 95 / 13
Регистрация: 10.10.2008
Сообщений: 606
15.09.2013, 23:01  [ТС] 3
как получить список в терминале я знаю, а как их считать в программе на С использую только системные вызовы стандарта Posix.
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
15.09.2013, 23:18 4
Bash
1
strace ps 2>&1 | view -
говорит, что ps c readdir сканирует содержимое /proc/..
судя по stackoverflow это вполне себе linux-way

ну это конечно linux-only

Добавлено через 1 минуту
собсно
http://stackoverflow.com/quest... x-function

No POSIX function exists to list running processes. That is OS specific, not portable, rarely needed by applications and thus not part of POSIX.

But since you need this on Linux, the most POSIXy solution would be to use functions opendir()/readdir()/closedir() to iterate over the content of /proc special file system.
1
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
15.09.2013, 23:44 5
Цитата Сообщение от HERETIC Посмотреть сообщение
Народ необходимо написать программу получающую со стандартного потока ввода список всех активных процессов
char *fgets(char *s, int size, stdin) читает строку со стандартного ввода
sscanf может прочитать из этой строки целое число
и вывести на экран процессы с четным PID. Заранее всем спасибо
pid % 2 равен нулю для четных pid
printf выведет прочитанную строку на экран

проверка
ps -e | ./имя_программы
0
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
16.09.2013, 00:18 6
gng, тогда уж просто popen
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
16.09.2013, 00:28 7
lex_x_x
Из условия
программу получающую со стандартного потока ввода список всех активных процессов
К чему плодить лишние сущности?
0
94 / 95 / 13
Регистрация: 10.10.2008
Сообщений: 606
16.09.2013, 00:28  [ТС] 8
Список я получаю вот так
Bash
1
ps -A -o pid,fname
Проблема не в получении списка процессов, а считывании. Кстати, fgets - это библиотечная функция, а не системная. Получается, что нужно считывать при помощи write(stdin, buf, sizeof(int)) - не уверен что правильно. И вот здесь у меня загвоздка - как из полученной строки выделить PID.
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
16.09.2013, 01:10 9
Кстати, fgets - это библиотечная функция, а не системная
Понятие "системная функция" не определено однозначно. Определены "системные вызовы". Для них в libc сделаны оберточные функции, которые, нередко, кроме передачи параметров системному вызову, осуществляют и другую работу.
Посмотрите man syscalls для определенности.
К слову, системных вызовов scanf и printf тоже не существует.
Если вы пишете не на ассемблере, думаю, нужно ориентироваться на стандартные функции libc, в число которых входит и fgets,и scanf, и printf
как из полученной строки выделить PID.
Например
C
1
sscanf (s, "%d", &pid);
Добавлено через 21 минуту
PS.
Впрочем, если вы программируете ядро или даже урезанное ядро, напр. ibm blue gene, то список функций может действительно оказаться сильно окраниченным.
0
94 / 95 / 13
Регистрация: 10.10.2008
Сообщений: 606
16.09.2013, 01:17  [ТС] 10
пишу не ядро, а курсач. В задании сказано использовать только системные вызовы
0
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
16.09.2013, 10:11 11
Интересное задание. Ввод списка процессов со stdin как бы подразумевает, что можно использовать все стандартные функции.
В этом случае черновой код может быть примерно таким
C
1
2
3
4
5
6
7
8
9
#include <stdio.h>
main() {
  int pid;
  char s[100];
  while (fgets (s, 99, stdin)) {
    sscanf (s, "%d", &pid);
    if (!(pid%2)) printf ("%s", s);
  }
}
Если же использовать только системные вызовы, по половинчатое решение без проверок перекрытия буфера
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
 
int h_gets (char *s) {
  unsigned char c;
  int i;
  for (i=0; ; i++) {
    if (!read (0, &c, 1)) return 0;
    if ((c == '\n') || (c == EOF) ) c= 0;
    s[i]= c;
    if (!c) return 1;
  }
}
 
int h_getnum (char *s) {
  int i, res= 0;
  for (i= 0; s[i]; i++) {
    if (s[i] >= '0' && s[i] <= '9') res= res * 10 + s[i] - '0';
    else if (res) return res;
  }
  return -1;
}
 
main() {
  int pid;
  char s[100];
  while (h_gets (s)) {
    pid = h_getnum (s);
    if (!(pid%2)) printf ("%s\n", s);
  }
}
Переписать printf через write, думаю, сможете сами.

Добавлено через 4 минуты
PS. h_ в названии функций - первая буква от HERETIC ))
1
16.09.2013, 10:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.09.2013, 10:11
Помогаю со студенческими работами здесь

Как на WSH получить список активных пользователей домена?
как на WSH получить список активных пользователей (залогинившихся) домена ?

Не удается получить список активных сокетов при их поиске
Вообщем хочу найти сокеты внутри клиента. Для этого инъектирую dll в программу и начинаю поиск...

Как с помощью ADSI получить список только активных компьютеров домена?
Как с помощью ADSI получить список только активных компьютеров домена? заранее спасибо

С помощью командной строки получить список активных сетевых служб на удаленных узлах
Необходимо с помощью командной строки получить список активных сетевых служб на удаленных узлах:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru