c - 如何用 C 检测 Linux 上 exec'ed 子进程的文件事件?

标签 c linux file-io child-process

我有我的程序,它执行另一个进程(不是我的,将其视为黑匣子)。有没有办法检测该子进程的操作,例如 open()close()

我特别感兴趣的是查找所有新创建的文件或现有文件,这些文件是为了创建而打开的(open()O_CREAT 标志)。

最佳答案

工作方法是在我自己的共享库中重新定义open(),并通过LD_PRELOAD将其预加载到exec()'ed进程中> 环境变量。感谢@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

关于c - 如何用 C 检测 Linux 上 exec'ed 子进程的文件事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24349570/

相关文章:

c - 在单链表中插入字符串

c - 如何将包含动态分配数组的结构写入二进制文件?

c - 索引超过 C 数组的末尾

php - 在 www-data (apache2, php) 下启动 shell 进程

c - 使用 fread() 和 fseek() 在 C 中读取文件的一部分

java - 从文件中读取N行并将其保存到新文件中

c - Scanf 在 C 中无法正确读取字符串。出了什么问题?

linux - 如何开始修复存储库

linux - bash 脚本上的 "Cache"凭据

Python将二进制图像(PNG)数据写入文件