LINUX.ORG.RU

FASM - Как получить список запущенных приложений

 ,


0

2

Добрый день. Пожалуйста, подскажите, как получить список работающих процессов? Аналогично тому, что показывает top в нижней таблице. Прошу именно фасмовый вариант, т.к. пишу на пурике (PureBasic), а он как раз поддерживает фасмовые вставки. К сожалению за свои почти пол века так и не научился нормально яндексить и гуглить, поэтому буду благодарен любой ссылке на документацию.

Требуется (техническое):

  • Служебное имя процесса, как его воспринимает ОСь
  • Путь к исполняемому файлу
  • Если есть что-то графическое, привязанное к процессу, то необходимо и это получить.

Если фасмового ничего нет, то может на Си есть? Я бы посмотрел, как оно внутри работает. Главное что бы максимально было всё упрощено, потому что из того же top физически не смог разобраться, что там и кого вызывает(((

Пожалуйста, подскажите, как получить список работающих процессов?

В линуксе либо читать /proc/<PID>/cmdline в цикле, либо выполнять ps -eo pid,cmd и парсить выхлоп. По другому вродь никак. Вот пример через /proc:

#include <stdio.h>
#include <dirent.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

#define CMDLINE_PATH_SIZE 256
#define CMDLINE_BUFFER_SIZE 4096

int is_numeric(const char *str) {
    while (*str) {
        if (!isdigit(*str++)) return 0;
    }
    return 1;
}

void print_cmdline(const char *pid) {
    char path[CMDLINE_PATH_SIZE];
    char buffer[CMDLINE_BUFFER_SIZE];
    snprintf(path, sizeof(path), "/proc/%s/cmdline", pid);

    FILE *fp = fopen(path, "r");
    if (!fp) return;

    size_t len = fread(buffer, 1, sizeof(buffer) - 1, fp);
    fclose(fp);

    if (len > 0) {
        buffer[len] = '\0';

        printf("PID %s: ", pid);
        bool end_cmd = false;
        for (size_t i = 0; i < len; i++) {
            if (buffer[i] == '\0') {
                putchar(' ');
            } else {
                putchar(buffer[i]);
            }
        }
        putchar('\n');
    }
}

int main(void) {
    DIR *proc = opendir("/proc");
    struct dirent *entry;

    if (!proc) {
        perror("opendir(/proc)");
        return 1;
    }

    while ((entry = readdir(proc)) != NULL) {
        if (entry->d_type == DT_DIR && is_numeric(entry->d_name)) {
            print_cmdline(entry->d_name);
        }
    }

    closedir(proc);
    return 0;
}

Во фряхе всю инфу о работающих процессах можно прочитать напрямую с ядра при помощи kinfo_getallproc(). Функция вернет указатель на структуру типа kinfo_proc, которую потом очень удобно парсить по любому нужному параметру.

iron ★★★★★
()
Ответ на: комментарий от iron

В линуксе либо читать /proc/<PID>/cmdline в цикле, либо выполнять ps -eo pid,cmd и парсить выхлоп. По другому вродь никак

Ну ты уж определись, считается ли парсинг программ отдельными способами или нет. Потому что если считается - то парсить можно не только ps, а ещё много чего разного, тот же top. Но внутри они все читают /proc (на линуксе), так что на самом деле способ всего один.

firkax ★★★★★
()

Аналогично тому, что показывает top в нижней таблице.

И, где, top показывает:

что-то графическое, привязанное к процессу,

Так, вам уже написали, что читайте файлы в /proc. И не забывайте про обработку ошибок. Как только процесс завершается, он исчезает из /proc. Легко можно получать ошибку ENOENT («No such file or directory»). ЕМНИП, там ещё может возникать EAGAIN, который нужно считать за ошибку и не пытаться читать снова.

Касательно «графического», не совсем понятно про что речь, но, наверное, парсить переменные среды (/proc/PID/environ)...

mky ★★★★★
()
Ответ на: комментарий от mky

Про графику имел в виду виндовую связку. Там некоторые процессы привязаны к открытым окнам. К сожалению в линуксе пока не нашёл подобного. Штудирую структуру каталога /proc и последовательно читаю про сис.вызовы. Тут же нашёл раздел «Похожие темы», где есть ссылка на такой же вопрос от 2010 года. Тоже почитываю В общем пока сильно «плаваю» в этом вопросе

strange2007
() автор топика
Ответ на: комментарий от strange2007

Там некоторые процессы привязаны к открытым окнам. К сожалению в линуксе пока не нашёл подобного.

Из за зоопарка на десктопе, в линуксе с этим все плохо.
Если под иксами еще был стандарт EWMH, который поддерживало большинство wm, где можно связать окно с pid.
То под вяленого для этого ввели Foreign toplevel list протокол, но его поддерживают далеко не все композиторы, а некоторые и не собираются поддерживать по соображениям безопасности.

arax ★★
()
Последнее исправление: arax (всего исправлений: 1)
/proc/<pid>/comm — короткое имя процесса (то, что видно в top)
/proc/<pid>/exe — символьная ссылка на исполняемый файл
/proc/<pid>/environ — переменные окружения процесса
/proc/<pid>/cmdline — аргументы командной строки

Чтобы проверить, связан ли процесс с графическим интерфейсом:

  1. Откройте /proc/<pid>/environ
  2. Прочитайте его и проверьте наличие переменной окружения DISPLAY=…
  3. Либо проверьте, открыты ли процессы соединения с X11 (это сложнее без использования lsof или других утилит)

А так язык особо не важен, у тебя есть набор API - syscalls, у тебя есть файловая система где много интересной информации в виде файлов. Ну а дальше просто смотришь в доках какую API или какой файл прочитать и парсишь результат. В общем я тебе буквально разработку на всех языках мира сейчас рассказал. А так же попробуй всякие дипсики и прочие нейронки, намного проще будет найти информацию

AntonyRF ★★★★
()
Последнее исправление: AntonyRF (всего исправлений: 1)
Ответ на: комментарий от AntonyRF

Прочитайте его и проверьте наличие переменной окружения DISPLAY=

Это вообще ни о чем не говорит

Либо проверьте, открыты ли процессы соединения с X11

Не нужно, гораздо проще получить список окон и связаные pid, делается это элементарно, достаточно посмотреть исходники wmctrl.
Проблема в том что есть еще вяленый, а там это в общем случае не сделать.

arax ★★
()
Ответ на: комментарий от strange2007

С графикой вобще сложно. Во-первых, может быть X11, а может быть вайленд, процесс с ними работают по-разному. А, во-вторых, графический эмулятор терминала. С окном, допустим, связан xterm, но, только он особо ничего не делает, а bash, который туда что-то выводит и получает нажатия клавиш, связан с терминалом, а не с окном...

mky ★★★★★
()