inotify_add_watch
时间: 2023-07-31 20:11:44 浏览: 59
inotify_add_watch是Linux系统的一个系统调用函数,用于向inotify实例添加一个监视文件或目录的事件。它的原型如下:
```c
int inotify_add_watch(int fd, const char *pathname, uint32_t mask);
```
其中,fd是inotify实例的文件描述符;pathname是要被监视的文件或目录的路径;mask是要监视的事件类型的掩码。
该函数执行成功时返回一个非负整数,表示该监视对象的唯一标识符;执行失败时返回-1,并设置errno错误码。可能的错误码包括:EBADF(无效的文件描述符)、EFAULT(无效的pathname指针)、ENOMEM(内存不足)、ENOSPC(无法添加更多的监视对象)、ENAMETOOLONG(pathname过长)等。
相关问题
Linux C如何避免inotify_add_watch no such file or directory
要避免inotify_add_watch函数返回no such file or directory错误,需要确保要监视的目录存在。可以通过调用access或stat函数来判断目录是否存在,如果目录不存在,则可以先创建该目录。
以下是一个示例代码片段:
```
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/inotify.h>
#include <sys/stat.h>
int main(int argc, char **argv) {
int fd, wd;
char *path = "/path/to/dir";
// 检查目录是否存在
struct stat st;
if (stat(path, &st) == -1) {
perror("stat");
exit(EXIT_FAILURE);
}
// 创建 inotify 实例
fd = inotify_init();
if (fd == -1) {
perror("inotify_init");
exit(EXIT_FAILURE);
}
// 添加监视器
wd = inotify_add_watch(fd, path, IN_ALL_EVENTS);
if (wd == -1) {
perror("inotify_add_watch");
exit(EXIT_FAILURE);
}
// 等待事件发生
// ...
// 移除监视器
inotify_rm_watch(fd, wd);
// 关闭 inotify 实例
close(fd);
return 0;
}
```
在上面的代码中,首先通过调用stat函数来检查要监视的目录是否存在。如果目录不存在,程序会输出一个错误信息并退出。如果目录存在,则继续创建inotify实例,并调用inotify_add_watch函数添加一个监视器。如果inotify_add_watch返回了no such file or directory错误,则说明要监视的目录不存在,程序会输出一个错误信息并退出。如果inotify_add_watch成功添加了监视器,则可以继续等待事件的发生。最后,需要调用inotify_rm_watch函数移除监视器,并关闭inotify实例。
c++写代码编写hook系统的inotify文件监管并让inotify_init()始终返回一个假值
以下是使用C++编写hook系统的inotify文件监管并让inotify_init()始终返回一个假值的代码示例:
```C++
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>
#include <sys/inotify.h>
#include <dlfcn.h>
#define TAG "INOTIFY_HOOK"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
static int (*original_inotify_init)(void);
static int (*original_inotify_add_watch)(int fd, const char *pathname, uint32_t mask);
int my_inotify_init(void) {
LOGD("inotify_init hooked, return false");
return -1;
}
int my_inotify_add_watch(int fd, const char *pathname, uint32_t mask) {
int wd = original_inotify_add_watch(fd, pathname, mask);
LOGD("inotify_add_watch hooked, wd = %d, pathname = %s, mask = %u", wd, pathname, mask);
return wd;
}
void hook_inotify() {
void *handle = dlopen("libc.so", RTLD_NOW);
if (handle != NULL) {
original_inotify_init = (int (*)(void)) dlsym(handle, "inotify_init");
original_inotify_add_watch = (int (*)(int, const char *, uint32_t)) dlsym(handle, "inotify_add_watch");
if (original_inotify_init != NULL && original_inotify_add_watch != NULL) {
MSHookFunction((void *) original_inotify_init, (void *) my_inotify_init, (void **) &original_inotify_init);
MSHookFunction((void *) original_inotify_add_watch, (void *) my_inotify_add_watch, (void **) &original_inotify_add_watch);
LOGD("inotify hook success!");
} else {
LOGE("dlsym failed: %s", dlerror());
}
dlclose(handle);
} else {
LOGE("dlopen failed: %s", dlerror());
}
}
```
这段代码与前面的示例代码类似,不同之处在于my_inotify_init函数的实现,它始终返回一个假值-1。这样,在应用程序调用inotify_init函数时,将始终返回一个假值,无论实际上是否成功创建了inotify实例。
请注意,这种hook行为可能会影响应用程序的正常运行,因此请仔细考虑是否需要这样做,并在测试之前备份应用程序和设备数据。