对inotify做出反应并打印事件的程序

时间:2012-02-01 16:05:13

标签: c++ inotify

我在Ubuntu工作。我想监视一个文件夹并打印子文件夹中弹出的每个事件(打印文件)。 我有以下代码但它不起作用。执行时,没有事件的println。

在第二个代码中,我只看到文件夹中的事件。每个子文件夹中的事件都不会弹出。

#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
std::string exec(char* cmd) {
    FILE* pipe = popen(cmd, "r");
    if (!pipe) return "ERROR";
    char buffer[256];
    std::string result = "";
    while(!feof(pipe)) {
        if(fgets(buffer, 256, pipe) != NULL)
                result += buffer;
    }
    pclose(pipe);
    cout<<"result is: "<<result<<endl;
    return result;
}

int main()
{
    //while(1)
    //{
    string s=exec((char*)"inotifywait -rme create /home/folder/");

    cout << s << endl;
    //}
    return 0;
}

此代码仅打印我正在监控的文件夹中的事件。它不会打印每个子文件夹中的事件。我不知道如何根据我的需要改进它。

#include <sys/inotify.h>
#include <sys/ioctl.h>
#include <iostream>

void processNewFiles(int fd, int wd);


int main(int argc, char** argv)
{
   const char* dirPath = "/home/folder/" ;//argv[1];

   int fd = inotify_init();
   int wd = inotify_add_watch(fd, dirPath, IN_CREATE);

   if (wd)
   {
      processNewFiles(fd, wd);

      inotify_rm_watch(fd, wd);
   }
}


void processNewFiles(int fd, int wd)
{
   bool done = false;

   do
   {
      int qLen = 0;

      ioctl(fd, FIONREAD, &qLen);

      char* buf = new char[qLen];
      int   num = read(fd, buf, qLen);

      if (num == qLen)
      {
         inotify_event* iev = reinterpret_cast<inotify_event*>(buf);

         if (iev->wd == wd && iev->mask & IN_CREATE)
         {
            std::cout << "New file created: " << iev->name << std::endl;
         }
      }

      delete [] buf;
   } while (!done);
}

1 个答案:

答案 0 :(得分:1)

您的第二个解决方案不起作用,因为inotify_add_watch无法递归工作。您必须手动为子目录添加监视。由于这可能很烦人,也可以像在第一个例子中一样使用实用程序inotifywait。

你的第一个例子没有用,因为你永远在读管道。如果你杀死inotifywait进程(例如,如果你是机器上唯一的人,并且这是唯一使用“killall inotifywait”的inotifywait进程),你将得到你的输出,因为你将从管道中取出循环读数。如果你在循环中输出一些东西,它也会起作用。