如何在C语言中检测Linux上exec的子进程的文件活动?

时间:2014-06-22 08:41:28

标签: c linux file-io child-process

我有我的程序,exec的另一个进程(不是我的,认为它是黑盒子)。有没有办法检测此子进程的操作,例如open()close()

特别是我有兴趣找到所有新创建的文件或现有文件,这些文件是为了创建而打开的(O_CREAT的{​​{1}}标志)。

1 个答案:

答案 0 :(得分:0)

工作方法是重新定义我自己的共享库中的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