Как определить активность файлов исполняемого дочернего процесса в Linux в C?

У меня есть моя программа, в которой exec - другой процесс (не мой, считаю его черным ящиком). Есть ли способ обнаружения операций, как open() а также close()-А для этого дочерний процесс?

Особенно меня интересует поиск всех вновь создаваемых файлов или существующих файлов, которые открываются с намерением создать (O_CREAT флаг для open()).

1 ответ

Решение

Рабочий подход заключается в переопределении open() в моей собственной общей библиотеке и предварительно загрузить его внутри exec()'процесс через LD_PRELOAD переменная окружения. Спасибо @alk за подход.

Код для переопределения open() похоже:

#include <fcntl.h>
#include <dlfcn.h>
#include <stdarg.h>
#include <sys/types.h>

extern "C" {

int open(const char *pathname, int flags, ...) {
  bool has_mode = false;
  mode_t mode = 0;
  if (flags & O_CREAT) {
    va_list ap;
    va_start(ap, flags);
    mode = va_arg(ap, mode_t);
    has_mode = true;
    va_end(ap);
  }

  using Fn = int (*)(const char * pathname, int flags, ...);
  Fn new_open = reinterpret_cast<Fn>(dlsym(RTLD_NEXT, "open"));

  // Do something useful.

  if (has_mode) {
    return new_open(pathname, flags, mode);
  } else {
    return new_open(pathname, flags);
  }
}

}  // extern "C"

Единственная проблема с fcntl.h - может иметь какое-то вызывающее объявление для функции open(), Вам нужен этот файл, чтобы получить определение O_CREAT, Другой способ - включить файл с определением напрямую: в моем случае это файл asm-generic/fcntl.h,

Другие вопросы по тегам