Я написал простой демон. Этот демон должен реагировать, когда я запускаю любую программу. Как это сделать? В большом цикле демона:
while(1)
{
/* function which catches new programm running */
}
Какие функции вызывать в Linux, когда я запускаю новую программу (создаю новый процесс)?
Мне было интересно выяснить, как это сделать без опроса. Похоже, что 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 линкера, чтобы утопить вас в шуме.