linux - Inotify 监听moved_from/moved_to 事件
问题描述
我正在使用 inotify 来监听目录IN_MOVED_FROM
/IN_MOVED_TO
对上的事件。这是一个简单的汇编程序:
SYS_exit equ 0x3C
SYS_inotify_init equ 253
SYS_read equ 0x00
MEMPAGE_SIZE equ 4096
SYS_inotify_add_watch equ 254
IN_MOVED_FROM equ 0x40
IN_MOVED_TO equ 0x80
section .text
global _start
_start:
mov rax, SYS_inotify_init
syscall
mov r13, rax ;storing inotify instance
mov rax, SYS_inotify_add_watch
mov rdi, r13
mov rsi, watcher_dir
mov rdx, IN_MOVED_TO
syscall
mov rax, SYS_inotify_add_watch
mov rdi, r13
mov rsi, watcher_dir
mov rdx, IN_MOVED_FROM
syscall
mov rax, SYS_read
mov rdi, r13
mov rsi, buf
mov rdx, MEMPAGE_SIZE
syscall <------ I set gdb breakpoint here
mov eax, SYS_exit
mov rdi, 0x00
syscall
section .bss
buf resb MEMPAGE_SIZE ;reserving a page
section .data
watcher_dir: db '/home/me/asm/inotify/data', 0
好的,我在 gdb 中运行程序,将断点设置为从inotify
描述符读取并检查
struct inotify_event {
int wd; /* Watch descriptor */
uint32_t mask; /* Mask describing event */
uint32_t cookie; /* Unique cookie associating related
events (for rename(2)) */
uint32_t len; /* Size of name field */
char name[]; /* Optional null-terminated name */
};
当我如下移动文件时
mv data/test data/test.moved
我只有一个事件IN_MOVED_FROM
(gdb) x/1xw $rsi + 4
0x600138: 0x00000040
长度是0x10:
(gdb) x/1xw $rsi + 12
0x600140: 0x00000010
和
(gdb) x/1xw $rsi + 32
0x600154: 0x00000000
但我预计IN_MOVED_TO
事件会在buf
(迷路?)。当我交换inotify_add_watch
代码中的顺序时,第一个再次丢失。为什么?
解决方案
这不是汇编问题,你只是使用了系统调用错误。您忘记指定IN_MASK_ADD
. 这就是man inotify所说的:
IN_MASK_ADD
如果对应于路径名的文件系统对象的监视实例已经存在,则将掩码中的事件添加(或)到监视掩码(而不是替换掩码)。
诚然,默认情况下替换它是违反直觉的,inotify_add_watch
并且仅在您明确要求时才添加。
推荐阅读
- javascript - React.js 对话框组件消失但仍保留在 DOM 中
- r - 问题:两组的 Kruskal-Wallis 检验
- python - 如何在python中捕获异常消息?
- wpf - 如何在 MahApps.Metro.Controls 窗体的子窗口中添加 WPF Web 浏览器
- python - 我正在尝试使用 python 3 而不是 python 2
- reactjs - React.js:useState Hook Setter 没有更新状态
- python - Django/Wagtail - 自定义表单小部件 CSS/JS 媒体未使用模板文件呈现
- regex - 仅当指定的字符出现一次时才匹配的正则表达式
- node.js - 上传文档或图像以及其他表单字段 node express
- excel - MS Excel 在 Google 表格中替代 ={A:A} 公式