【问题标题】:help with inotify C script帮助 inotify C 脚本
【发布时间】:2011-10-05 14:09:24
【问题描述】:

Source

我以前从未使用过 C。此脚本将侦听器添加到目录中,并通过回显到终端来通知用户,然后在文件事件发生时退出。我想将脚本修改为不退出,而是继续监视文件夹。我认为关键可能是这一行:

length = read( fd, buffer, BUF_LEN );

但我真的不明白这里发生了什么。 read() 函数的描述可能对那些非常了解 C 的人有帮助:

Using inotify is simple: Create a file descriptor, attach one or more watches (a watch is a path and set of events), and use the read() method to receive event information from the descriptor. Rather than burn scarce cycles, read() blocks until events occur.

但我不属于那个类别。

【问题讨论】:

    标签: c linux directory buffer inotify


    【解决方案1】:

    该程序的存在仅仅是因为一旦它捕捉到一个事件,没有什么能阻止它到达exit( 0 );。您可以将 fd = inotify_init();( void ) close( fd ); 的所有内容包装在一个循环中,只要您愿意,它就会重新开始。

    问题不在length = read( fd, buffer, BUF_LEN );。该部分只是等待事件发生,并不要求程序退出。真的是main被设计成一次性执行并退出。

    【讨论】:

    • 正确。所以让我感到困惑的是while ( i < length ) 是循环条件,其中lengthread() 调用中提到的变量。为什么read()的输出使用“长度”?
    • read() 直接读入buffer 并返回读取的字节数,存储在length 中。我不完全确定while ( i < length ) 条件是什么,但是每个循环i 都会增加一个事件的长度,所以我假设程序可以捕获同时发生的事件并且循环读取它们?我也不是 C 大师,所以这只是我的猜测。
    • 没错。 inotify 可以对多个事件进行排队,然后 read() 将返回它们。 while (i < length) 循环检查一个这样的inotify 调用的结果。为了做 OP 想要做的事情,他需要在 length = read( fd, buffer, BUF_LEN ); 之前进行另一个(无限)循环,并一直持续到 while ( i < length ) 循环结束(以及 break 用于 length < 0 案例)。
    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 2022-06-24
    • 2011-08-01
    • 1970-01-01
    • 2011-02-24
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多