Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用inotify时缺少/dev/sdX的通知_C++_Linux_Hard Drive_Inotify - Fatal编程技术网

C++ 使用inotify时缺少/dev/sdX的通知

C++ 使用inotify时缺少/dev/sdX的通知,c++,linux,hard-drive,inotify,C++,Linux,Hard Drive,Inotify,我想在硬盘/硬盘分区上的数据被修改时得到通知。我在Linux上,希望它能从C++中检查。 我的方法是在linux设备文件/dev/sdX(sdX=适当的硬盘/磁盘分区文件)上使用inotify。我为/dev/sda1文件编写了程序。我的期望是,每当我在主目录中的任何位置创建/删除文件/文件夹时,都应该动态修改文件/dev/sda1(因为我的/dev/sda1安装在位置“/”),并且应该通知我进行修改。但是,我没有得到通知 这是我的密码:- #include <stdio.h> #in

我想在硬盘/硬盘分区上的数据被修改时得到通知。我在Linux上,希望它能从C++中检查。 我的方法是在linux设备文件/dev/sdX(sdX=适当的硬盘/磁盘分区文件)上使用inotify。我为/dev/sda1文件编写了程序。我的期望是,每当我在主目录中的任何位置创建/删除文件/文件夹时,都应该动态修改文件/dev/sda1(因为我的/dev/sda1安装在位置“/”),并且应该通知我进行修改。但是,我没有得到通知

这是我的密码:-

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

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

const char * file_path = "/dev/sda1";

int main( int argc, char **argv ) 
{
  int length, i;
  int fd;
  int wd;
  char buffer[BUF_LEN];


  while(1)
  {

    fd = inotify_init();

     if ( fd < 0 ) {
       perror( "inotify_init" );
     }

     wd = inotify_add_watch(fd, file_path, IN_MODIFY);

     if (wd < 0)
            perror ("inotify_add_watch");


      length = read( fd, buffer, BUF_LEN );

      printf("here too\n");

      if ( length < 0 ) {
          perror( "read" );
      }

          i = 0;

      while ( i < length ) {
          struct inotify_event *event = ( struct inotify_event * ) &buffer[ i ];
          printf("inotify event\n");


         if ( IN_MODIFY ) {
             if ( event->mask & IN_ISDIR ) {
                  printf( "The directory %s was modified.\n", file_path );
            }
              else {
                  printf( "The file %s was modified.\n", file_path );
              }
          }

          i += EVENT_SIZE + event->len;

      }

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



  exit( 0 );
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义事件大小(sizeof(结构索引事件))
#定义基本长度(1024*(事件大小+16))
const char*file_path=“/dev/sda1”;
int main(int argc,字符**argv)
{
int长度,i;
int-fd;
int-wd;
字符缓冲区[BUF_LEN];
而(1)
{
fd=inotify_init();
如果(fd<0){
perror(“inotify_init”);
}
wd=inotify\u add\u watch(fd,文件路径,IN\u MODIFY);
如果(wd<0)
佩罗(inotify_add_watch);
长度=读取(fd、缓冲区、BUF_LEN);
printf(“此处也有\n”);
如果(长度<0){
佩罗(“阅读”);
}
i=0;
while(i掩码和IN_ISDIR){
printf(“目录%s已修改。\n”,文件路径);
}
否则{
printf(“文件%s已修改。\n”,文件路径);
}
}
i+=事件大小+事件->镜头;
}
(无效)inotify_rm_手表(fd、wd);
(无效)关闭(fd);
}
出口(0);
}
当文件被修改时,此代码会正确地通知普通文件。但是,只要相应的设备装载目录发生更改,它就不会在设备文件上工作。我的方法有什么问题吗?当安装在/dev/sdX文件上的文件系统发生变化时,它不应该被动态修改吗


我发现了一个类似的问题,但没有有用的答案

/dev/sda1
是块设备,而不是常规文件。inotify无法观察设备进行修改。(想想这对其他类型的设备意味着什么,比如
/dev/random
。)


如果您想查看文件系统上的任何更改,请改用。

fanotify是否能够查看设备文件以进行修改?当我在安装它的目录中添加/删除/编辑一个文件/目录时,我能指望它通知修改吗?不是一个设备文件,但它可以立即观察整个文件系统的更改。(这更好,因为并非所有文件系统都有设备支持。)阅读我链接的文档。我目前正在处理RAID。因此,我需要在特定的外部硬盘/硬盘分区中进行修改的通知。该硬盘分区可能不会作为文件系统装入。所以,观察一个挂载的文件系统对我来说没有用处。@YogirajKulkarni那么你就不走运了。没有用于观察块设备更改的用户空间接口;Linux中已经存在的RAID实现(有几个!)都在内核中。不要认为所有RAID实现都在内核中。我知道MDADM,它是一个用C编写的Linux实用程序。我刚刚从github repo下载了它的源代码,编译了它(使用Makefile),并且我能够运行它。因此,似乎在应用程序级别也是可能的。