ハードディスク/ハードディスクパーティションのデータが変更されたときに通知を受けたいとします。私はLinux上で、C++からチェックしたいと思っています。inotifyを使用しているときに/ dev/sdXの通知がない
私のアプローチは、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);
}
このコードは、ファイルが変更されます正しくいつでも通常のファイルに対して通知します。しかし、対応するデバイスのマウントディレクトリに変更がある場合、デバイスファイルに対しては機能しません。私のアプローチに何か問題はありますか?/dev/sdXファイルは、それにマウントされたファイルシステムが変更されるたびに、動的に変更されるべきではありませんか?
私は同様の質問Get notified about the change in raw data in hard disk sector - File change notificationを見つけましたが、役に立つ回答はありませんでした。
デバイスファイルの変更を監視できるようになりますか?ファイル/ディレクトリがマウントされているディレクトリに追加/削除/編集するたびに、変更の通知を期待できますか? –
デバイスファイルではありませんが、ファイルシステム全体を一度に見ることができます。 (これは、すべてのファイルシステムがデバイスに裏打ちされているわけではないので、より優れています。)リンクしたドキュメントを読んでください。 – duskwuff
私は現在RAIDを取り組んでいます。ですから、特定の外付けハードディスク/ハードディスクパーティションの変更通知をする必要があります。そのハードディスクパーティションは、ファイルシステムとしてマウントされないことがあります。だから、マウントされたファイルシステムを観察することは私にとっては役に立ちません。 –