tftp put 的 inotify 事件 IN_MODIFY 发生两次

2024-02-05

我正在使用 inotify 来监听对文件的修改。

当我测试文件修改时,程序运行正常。

# echo "test" > /tftpboot/.TEST

Output:
Read 16 data
IN_MODIFY

但是当我执行 tftp put 时,会生成两个事件:

tftp>  put .TEST
Sent 6 bytes in 0.1 seconds
tftp>

Output:
Read 16 data
IN_MODIFY
Read 16 data
IN_MODIFY

知道如何避免重复通知吗?

代码如下:

#include <sys/inotify.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <iostream>

using namespace std;

int main(int argc, const char *argv[])
{
    int fd = inotify_init();
    if (fd < 0)
    {
        cout << "inotify_init failed\n";
        return 1;
    }
    int wd = inotify_add_watch(fd, "/tftpboot/.TEST", IN_MODIFY);
    if (wd < 0)
    {
        cout << "inotify_add_watch failed\n";
        return 1;
    }
    while (true)
    {
        char buffer[sizeof(struct inotify_event) + NAME_MAX + 1] = {0};
        ssize_t length;

        do
        {
            length = read( fd, buffer, sizeof(struct inotify_event));
            cout << "Read " << length << " data\n";
        }while (length < 0);

        if (length < 0)
        {
            cout << "read failed\n";
            return 1;
        }

        struct inotify_event *event = ( struct inotify_event * ) buffer;
        if ( event->mask & IN_ACCESS )
            cout << "IN_ACCESS\n";
        if ( event->mask & IN_CLOSE_WRITE )
            cout << "IN_CLOSE_WRITE\n";
        if ( event->mask & IN_CLOSE_NOWRITE )
            cout << "IN_CLOSE_NOWRITE\n";
        if ( event->mask & IN_MODIFY )
            cout << "IN_MODIFY \n";
        if ( event->mask & IN_OPEN )
            cout << "IN_OPEN\n";
    }

    inotify_rm_watch( fd, wd );
    close (fd);

    return 0;
}

尝试使用IN_CLOSE_WRITE instead

Q: 有什么区别IN_MODIFY and IN_CLOSE_WRITE?

这 IN_MODIFY 事件在文件内容更改时发出(例如通过 write() 系统调用),而 IN_CLOSE_WRITE 发生在关闭更改时 文件。这意味着每个更改操作都会导致一个 IN_MODIFY 事件(它 在使用打开的文件进行操作期间可能会发生多次),而 IN_CLOSE_WRITE 仅发出一次(在关闭文件时)。

Q: 还是用比较好IN_MODIFY or IN_CLOSE_WRITE?

它不同于 个案。通常使用IN_CLOSE_WRITE比较合适 因为如果发出,相应文件上的所有更改都是安全的 写在文件里面。 IN_MODIFY 事件并不一定意味着文件 更改完成(数据可能保留在内存缓冲区中 应用)。另一方面,许多日志和类似文件必须 使用 IN_MODIFY 进行监视 - 在这些文件是的情况下 永久打开,因此不能发出 IN_CLOSE_WRITE。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

tftp put 的 inotify 事件 IN_MODIFY 发生两次 的相关文章

  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • 我可以在“字节数”设置为零的情况下调用 memcpy() 和 memmove() 吗?

    当我实际上没有什么可以移动 复制的时候 我是否需要处理这些情况memmove memcpy 作为边缘情况 int numberOfBytes if numberOfBytes 0 memmove dest source numberOfBy
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 我可以使用 Google Cloud Monitoring 来监控发生故障的 Container/Pod 吗?

    尝试Google Cloud Monitoring 当容器或 Pod 出现错误 无法调度等情况时 我正在努力使用开箱即用的指标创建警报 监控我的应用程序是否健康的非常基本的东西 使用 Prometheus 进行配置非常容易 有一种称为 GK
  • 具有 ocLazyLoad 的动态 ui-router 在解析中使用多个模块

    解决了见下文 从这个问题 解决方案开始工作堆栈溢出问题 https stackoverflow com questions 26630586 angularjs dynamic stateprovider with ui router vi
  • Dart 中有编译器预处理器吗?

    由于在启动 dart 应用程序之前需要进行编译 我想知道编译器预处理器是否可用 或者是否计划在不久的将来为 Dart 提供 到目前为止 我在网络上 在 dart 网站内部的搜索均未成功 通过预处理器 我的意思是 define max A B
  • Django:有没有办法知道应用程序中的网址是否有效?

    这是我的目标 用户想要登录 我在每个页面上创建一个按钮 并以 urlback 作为参数 例如 如果我们在该页面上http olivier life today 登录按钮将有一个像这样的 urlhttp olivier life login
  • 为什么我不能给指针赋值?

    在阅读了常见问题解答和我能找到的所有其他内容后 我仍然感到困惑 如果我有一个以这种方式初始化的 char 指针 char s Hello world 该字符串位于只读存储器中 我无法像这样更改它 s W 制作 Hello world 我明白
  • spring mvc中如何管理/存储后续请求的请求参数?

    我经常使用场景 列出用户 在ajax调用上 在搜索页面上 搜索按钮后单击一些搜索条件 我有 jQuery 数据表中的用户列表 点击编辑用户在数据表中 我单击以从列表中编辑用户 我重定向到用户更新表单 其中填充了用于更新目的的用户字段 更新用
  • “selectedFilters”不是有效的关键字参数

    我使用 PyQt5 当我尝试保存文件名时出现错误 csv file list QtWidgets QFileDialog getOpenFileName self Open file csv fileName csv file list f
  • 防止 AngularJs 使用 jQuery 库

    Question 如何防止 AngularJs 使用 jQuery 背景 我正在 AngularJs 中开发一个独立的应用程序 可以 插入 到现有的客户端网站中 这些客户端网站可能已经使用 jQuery 如果您使用过 AngularJs 您
  • 程序在发生任何事情之前就在调试器中崩溃了

    我正在使用 MinGW 工具链构建一个适用于 Windows XP 的应用程序 它有时会意外崩溃 因此 我尝试使用调试器 Gdb 但程序在发生任何事情之前都会以代码 03 退出 事实上 我从GDB看到的只是 新线程3184 0x7b8 新线
  • @SpringBootTest 导致“未找到给定包含的测试”

    我有简单的单元测试 它启动我的应用程序并测试某些服务是否已实例化 有点像健全性检查 但是 这些测试并未在我的完整测试套件中运行 当单独运行时 我收到错误No tests found for given includes com exampl
  • 如何忽略 new Date() 上的时区?

    我有一个名为的 JavaScript 函数updateLatestDate接收作为参数的对象数组 数组中对象的属性之一是MeasureDate日期类型的属性 功能updateLatestDate返回数组中存在的最新日期 这是函数 funct
  • spring boot/batch 通过代码禁用批量自动启动

    我正在编写一个 Spring Batch 应用程序 其中包含需要按特定顺序执行的不同作业 为了做到这一点 我通过 JobLauncher 手动运行作业 并通过在属性文件中添加以下属性来禁用 Spring 批处理提供的自动启动功能 sprin
  • Spring的未来-XD [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我听到有传言称 Spring XD 失去了开发动力 并且 Spring 转向云服务 由于我正在考虑 XD 我考虑的另一个是 Apache B
  • executeScript 未定义或不是 ManifestV3 扩展中的函数

    为什么 Chrome 的这个功能不起作用 我正在尝试这个例子 https developer chrome com docs extensions mv3 content scripts programmatic https develop
  • 将资源添加到 JAR

    我想将资源文件 图像 文本文件 包含在 JAR 中 我将资产文件夹添加到类路径中 因此当我在 netBeans 中运行我的程序时 它可以正常工作 但是如果我构建项目 我会收到错误 Not copying library C Users Fl
  • 如何将 Access-Control-Allow-Origin 添加到 jetty 服务器

    我有一个码头服务器来运行我的网络服务 最近 我开发了一个使用 Web 服务的程序 并遇到了 Access Control Allow Origin 问题 如何将 Access Control Allow Origin 添加到 jetty 嵌
  • 如何通过位置和分隔符提取字符串的子字符串

    我们如何从字符串中分割子字符串 就像我有绳子一样 String mainString Trade Time Trade Number Amount Rs 现在我有其他字符串 String subString Amount 然后我想提取子字符
  • 使用烧瓶中的数据参数重定向

    我试图学习 Flask 并遇到了以下问题 这是我试图实现的示例 app route poll methods GET POST def poll form PollForm if form validate on submit return
  • 如何将 EditText 输入限制为数字(可能是十进制和带符号)输入?

    我读过了Android 将 EditText 限制为数字 https stackoverflow com questions 5200689 android limiting edittext to numbers and 如何在 andr
  • tftp put 的 inotify 事件 IN_MODIFY 发生两次

    我正在使用 inotify 来监听对文件的修改 当我测试文件修改时 程序运行正常 echo test gt tftpboot TEST Output Read 16 data IN MODIFY 但是当我执行 tftp put 时 会生成两