Как определить запуск программ в Linux?

Я написал простой демон. Этот демон должен реагировать, когда я запускаю любую программу. Как это сделать? В большом цикле демона:

while(1)
{
   /* function which catches new programm running */
}

Какие функции вызывать в Linux, когда я запускаю новую программу (создаю новый процесс)?

26
задан Ciro Santilli 新疆改造中心法轮功六四事件 6 May 2018 в 08:51
поделиться

1 ответ

Мне было интересно выяснить, как это сделать без опроса. Похоже, что inotify () не работает с / proc, так что идея отсутствует.

Тем не менее, любая программа, которая динамически связана, при запуске будет получать доступ к определенным файлам, таким как динамический компоновщик. Это было бы бесполезно в целях безопасности, так как оно не сработало бы в статически связанной программе, но могло бы по-прежнему представлять интерес:

#include <stdio.h>
#include <sys/inotify.h>
#include <assert.h>
int main(int argc, char **argv) {
    char buf[256];
    struct inotify_event *event;
    int fd, wd;
    fd=inotify_init();
    assert(fd > -1);
    assert((wd=inotify_add_watch(fd, "/lib/ld-linux.so.2", IN_OPEN)) > 0);
    printf("Watching for events, wd is %x\n", wd);
    while (read(fd, buf, sizeof(buf))) {
      event = (void *) buf;
      printf("watch %d mask %x name(len %d)=\"%s\"\n",
         event->wd, event->mask, event->len, event->name);
    }
    inotify_rm_watch(fd, wd);
    return 0;
}

Распечатанные события не содержат никакой интересной информации - pid процесса запуска, кажется, не предоставляется inotify. Однако его можно использовать для пробуждения и запуска повторного сканирования / proc

. Также следует помнить, что недолговечные программы могут снова исчезнуть до того, как эта штука проснется и закончит сканирование / proc - возможно, вы узнаете, что они существовал, но не смог узнать, кем они были. И, конечно, кто угодно может просто продолжать открывать и закрывать fd для dyanmic линкера, чтобы утопить вас в шуме.

19
ответ дан 28 November 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: