GNU/Linux >> Belajar Linux >  >> Linux

Apa cara yang tepat untuk menggunakan inotify?

Di bawah ini adalah cuplikan bagaimana Anda dapat menggunakan inotify untuk menonton "aaa". Perhatikan bahwa saya belum menguji ini, saya bahkan belum mengompilasinya! Anda perlu menambahkan pemeriksaan kesalahan padanya.

Alih-alih menggunakan pembacaan pemblokiran, Anda juga dapat menggunakan polling/pilih di inotfd.

const char *filename = "aaa";
int inotfd = inotify_init();

int watch_desc = inotify_add_watch(inotfd, filename, IN_MODIFY);

size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1;
struct inotify_event* event = malloc(bufsiz);

/* wait for an event to occur */
read(inotfd, event, bufsiz);

/* process event struct here */

Jika yang Anda butuhkan hanyalah aplikasi baris perintah, ada yang bernama inotifywait yang menonton file menggunakan inotify

dari terminal 1

# touch cheese
# while inotifywait -e modify cheese; do 
>   echo someone touched my cheese
> done

dari terminal 2

echo lol >> cheese

inilah yang terlihat di terminal 1

Setting up watches.
Watches established.
cheese MODIFY 
someone touched my cheese
Setting up watches.
Watches established.

Perbarui :gunakan dengan hati-hati dan lihat komentar.


Karena pertanyaan awal tampaknya menyebutkan Qt sebagai tag seperti yang disebutkan dalam beberapa komentar di sini, mesin telusur mungkin mengarahkan Anda ke sini.

Jika seseorang ingin tahu bagaimana melakukannya dengan Qt, lihat http://doc.qt.io/qt-5/qfilesystemwatcher.html untuk versi Qt. Di Linux menggunakan subset dari Inotify, jika tersedia, lihat penjelasan di halaman Qt untuk detailnya.

Pada dasarnya kode yang dibutuhkan terlihat seperti ini:

di mainwindow.h tambahkan :

QFileSystemWatcher * watcher;
private slots:
    void directoryChanged(const QString & path);
    void fileChanged(const QString & path);

dan untuk mainwindow.cpp:

#include <QFileInfo>
#include <QFileSystemWatcher>

watcher = new QFileSystemWatcher(this);
connect(watcher, SIGNAL(fileChanged(const QString &)), this, SLOT(fileChanged(const QString &)));
connect(watcher, SIGNAL(directoryChanged(const QString &)), this, SLOT(directoryChanged(const QString &)));
watcher->addPath("/tmp/"); // watch directory
watcher->addPath("/tmp/a.file");  // watch file

tambahkan juga slot di mainwindow.cpp yang dipanggil jika ada perubahan file/direktori:

void MainWindow::directoryChanged(const QString & path) {
     qDebug() << path;
}
void MainWindow::fileChanged(const QString & path) {
     qDebug() << path;
}

  • Dokumentasi ( dari Pantau aktivitas sistem file dalam pemberitahuan )

inotify API C

inotify menyediakan tiga panggilan sistem untuk membuat semua jenis monitor sistem file:

  • inotify_init() membuat instance dari inotify subsistem di kernel dan mengembalikan deskriptor file jika berhasil dan -1 pada kegagalan. Seperti panggilan sistem lainnya, jika inotify_init() gagal, periksa errno untuk diagnostik.
  • inotify_add_watch() , seperti namanya, menambahkan jam tangan . Setiap jam tangan harus menyediakan nama jalur dan daftar peristiwa terkait, di mana setiap peristiwa ditentukan oleh konstanta, seperti IN_MODIFY . Untuk memantau lebih dari satu peristiwa, cukup gunakan logika atau — operator pipa (|) di C—di antara setiap peristiwa. Jika inotify_add_watch() berhasil, panggilan mengembalikan pengidentifikasi unik untuk jam tangan terdaftar; jika tidak, ia mengembalikan -1 . Gunakan pengenal untuk mengubah atau menghapus jam tangan terkait.
  • inotify_rm_watch() menghapus jam tangan.

read() dan close() panggilan sistem juga diperlukan. Diberikan deskriptor yang dihasilkan oleh inotify_init() , panggil read() untuk menunggu peringatan. Dengan asumsi deskriptor file tipikal, aplikasi memblokir sambil menunggu penerimaan peristiwa, yang dinyatakan sebagai data dalam aliran. Close() umum pada deskriptor file dihasilkan dari inotify_init() menghapus dan membebaskan semua jam tangan aktif serta semua memori yang terkait dengan instans inotify. (Peringatan jumlah referensi tipikal juga berlaku di sini. Semua deskriptor file yang terkait dengan instance harus ditutup sebelum memori yang dipakai oleh jam tangan dan oleh inotify dibebaskan.)

  • Contoh ( dari Kernel Korner - Intro to inotify )
#include "inotify.h"  
#include "inotify-syscalls.h"  
int wd;   
wd = inotify_add_watch (fd,   
            "/home/rlove/Desktop", IN_MODIFY | IN_CREATE | IN_DELETE);
if (wd < 0)
      perror ("inotify_add_watch");

Contoh ini menambahkan jam tangan di direktori /home/rlove/Desktop untuk setiap modifikasi, pembuatan file, atau penghapusan file.


Linux
  1. Cara yang tepat untuk menggunakan OnFailure di systemd

  2. Apa gunanya opsi -o dalam perintah useradd?

  3. Apa cara paling aman untuk mengizinkan pengguna membaca akses ke file log?

  1. Cara Menggunakan Perintah Tar di Linux

  2. Bagaimana cara menggunakan baris file sebagai argumen perintah?

  3. Apa cara yang tepat untuk memasukkan tab di sed?

  1. Apa tujuan dari file .bashrc di Linux?

  2. Apa gunanya $# di Bash

  3. Apa cara tercepat untuk menambahkan teks ke file dari baris perintah?