Pengaturcaraan C

Cara Menggunakan API inotify dalam Bahasa C

Cara Menggunakan API inotify dalam Bahasa C
Inotify adalah API Linux yang digunakan untuk pemantauan peristiwa sistem fail.

Artikel ini akan menunjukkan kepada anda bagaimana Inotify digunakan untuk melacak pembuatan, penghapusan, atau pengubahsuaian file dan direktori sistem file Linux.

Untuk memantau file atau direktori tertentu menggunakan Inotify, ikuti langkah-langkah berikut:

  1. Buat contoh inotify menggunakan inotify_init ()
  2. Tambahkan jalan penuh direktori atau fail yang akan dipantau dan acara yang akan ditonton menggunakan fungsi inotify_add_watch (). Dalam fungsi yang sama, kita menentukan acara mana (ON CREATE, ON ACCESS, ON MODIFY dll.), perubahan pada fail, atau perubahan pada direktori harus dipantau.
  3. Tunggu peristiwa berlaku dan baca penyangga, yang mengandungi satu atau lebih peristiwa yang berlaku, menggunakan baca () atau pilih ()
  4. Proseskan peristiwa yang telah berlaku, kemudian kembali ke langkah 3 untuk menunggu lebih banyak peristiwa, dan ulangi.
  5. Keluarkan deskriptor jam tangan menggunakan inotify_rm_watch ()
  6. Tutup contoh inotify.

Sekarang, kita akan melihat fungsi yang digunakan untuk Inotify API.

Fail tajuk: sys / maklumkan.h

inotify_init () fungsi:

Sintaks: int inotify_init (tidak sah)

Hujah: Tidak ada hujah.

Nilai Kembali: Setelah berjaya, fungsi mengembalikan deskriptor fail baru, kerana kegagalan fungsi mengembalikan -1.

inotify_add_watch () fungsi:

Sintaks: int inotify_add_watch (int fd, const char * pathname, uint32_t mask)

Hujah:

Fungsi ini mengambil tiga hujah.

Yang 1st argumen (fd) adalah deskriptor fail yang merujuk kepada contoh inotify (nilai kembali inotify_init () fungsi) .

Yang 2nd argumen adalah jalan direktori atau fail yang sedang dipantau.

Yang 3rd hujah adalah bitmask. Bitmask mewakili peristiwa yang sedang ditonton. Kita boleh menonton satu atau lebih acara menggunakan bitwise-OR.

Nilai Pulangan: Setelah berjaya, fungsi mengembalikan deskriptor jam, kerana kegagalan fungsi mengembalikan -1.

inotify_rm_watch () fungsi:

Sintaks: int inotify_rm_watch (int fd, int32_t wd)

Hujah:

Fungsi ini mengambil dua hujah.

Yang 1st argumen (fd) adalah deskriptor fail yang merujuk kepada contoh inotify (nilai kembali inotify_init () fungsi) .

Yang 2nd argumen (wd) adalah deskriptor jam tangan (nilai kembali dari inotify_add_watch ()  fungsi) .

Nilai Pulangan:  Setelah berjaya, fungsi mengembalikan 0, kerana kegagalan fungsi kembali -1.

Kami guna baca () fungsi (dinyatakan dalam tidak terkawal.h kepala file) untuk membaca buffer, yang disimpan maklumat peristiwa yang berlaku dalam bentuk inotify_event struktur. The inotify_event struktur dinyatakan dalam sys / maklumkan.h fail pengepala:

struktur inotify_event
int32t wd;
uint32_t topeng;
kuki uint32_t;
uint32_t len;
nama char [];

The inotify_event struktur mewakili peristiwa sistem fail yang dikembalikan oleh sistem inotify dan mengandungi anggota berikut:

Berikut adalah contoh yang berfungsi, menggunakan Inotify API:

Beritahu.fail c:

#sertakan
#sertakan
#sertakan
#sertakan
#sertakan
#sertakan // perpustakaan untuk fungsi fcntl
 
#tentukan MAX_EVENTS 1024 / * Bilangan maksimum acara untuk diproses * /
#define LEN_NAME 16 / * Dengan andaian panjang nama fail
tidak akan melebihi 16 bait * /
#tentukan EVENT_SIZE (sizeof (struct inotify_event)) / * ukuran satu acara * /
#tentukan BUF_LEN (MAX_EVENTS * (EVENT_SIZE + LEN_NAME))
/ * penyangga untuk menyimpan data acara * /
 
int fd, wd;
 
batal sig_handler (int sig)
 
/ * Langkah 5. Keluarkan deskriptor jam tangan dan tutup contoh inotify * /
inotify_rm_watch (fd, wd);
tutup (fd);
jalan keluar (0);
 

 
 
int main (int argc, char ** argv)
 
 
char * path_to_be_watch;
isyarat (SIGINT, sig_handler);
 
path_to_be_watched = argv [1];
 
/* Langkah 1. Memulakan inotify * /
fd = inotify_init ();
 
 
jika (fcntl (fd, F_SETFL, O_NONBLOCK) < 0)  // error checking for fcntl
jalan keluar (2);
 
/ * Langkah 2. Tambah Jam Tangan * /
wd = inotify_add_watch (fd, path_to_be_watch, IN_MODIFY | IN_CREATE | IN_DELETE);
 
jika (wd == - 1)
printf ("Tidak dapat menonton:% s \ n", path_to_be_watch);

lain
printf ("Menonton:% s \ n", path_to_be_watch);

 
 
semasa (1)
 
int i = 0, panjang;
penampan char [BUF_LEN];
 
/ * Langkah 3. Baca penampan * /
panjang = baca (fd, penyangga, BUF_LEN);
 
/ * Langkah 4. Proseskan peristiwa yang telah berlaku * /
Sementara saya 
struct inotify_event * event = (struct inotify_event *) & penyangga [i];
 
jika (acara-> len)
jika (acara-> topeng & IN_CREATE)
jika (acara-> topeng & IN_ISDIR)
printf ("Direktori% s telah dibuat.\ n ", event-> nama);

lain
printf ("Fail% s telah dibuat.\ n ", event-> nama);


lain jika (acara-> topeng & IN_DELETE)
jika (acara-> topeng & IN_ISDIR)
printf ("Direktori% s telah dihapuskan.\ n ", event-> nama);

lain
printf ("Fail% s telah dihapuskan.\ n ", event-> nama);


lain jika (acara-> topeng & IN_MODIFY)
jika (acara-> topeng & IN_ISDIR)
printf ("Direktori% s telah diubah.\ n ", event-> nama);

lain
printf ("Fail% s telah diubah.\ n ", event-> nama);



i + = EVENT_SIZE + acara-> len;


Pengeluaran:

Untuk melaksanakan program dan melihat hasilnya, kita mesti membuka dua terminal terlebih dahulu. Satu terminal digunakan untuk menjalankan program Beritahu.c. Di terminal kedua, kita menuju ke jalan yang sedang diperhatikan oleh Inotify.c. Sekiranya kita membuat direktori atau fail apa pun, mengubah fail apa pun, atau menghapus direktori atau fail apa pun, kita akan melihatnya di terminal pertama.

Di dalam Beritahu.c contohnya, yang tidak terkawal.h fail header digunakan untuk baca () dan tutup () fungsi, yang stdlib.h fail header digunakan untuk keluar () fungsi, yang isyarat.h fail header digunakan untuk isyarat() fungsi dan SIG_INT makro (Lihat pengendalian isyarat untuk perincian), dan fcntl.h fail header digunakan untuk fcntl () fungsi.

Kami menyatakan fd (contoh notifikasi) dan wd (deskriptor menonton) sebagai pemboleh ubah global sehingga pemboleh ubah ini dapat diakses dari semua fungsi.

The fcntl () fungsi digunakan sehingga ketika kita membaca menggunakan fd penerangan, utas tidak akan disekat.

Seterusnya, kami menambah jam tangan menggunakan inotify_add_watch () fungsi. Di sini, kita lulus fd, jalan direktori yang akan ditonton, dan topeng. Anda boleh melewati topeng peristiwa yang ingin anda pantau menggunakan bitwise-OR.

Sekarang, baca penampan. Maklumat mengenai satu atau lebih peristiwa disimpan dalam penyangga. Anda boleh memproses semua acara satu persatu menggunakan gelung. Anda boleh memeriksa acara-> topeng untuk mengetahui jenis peristiwa yang telah berlaku.

Kami menggunakan loop sementara yang tidak terhingga untuk memeriksa secara berterusan bila kejadian berlaku. Sekiranya tidak ada peristiwa yang berlaku, fungsi read () kembali dengan 0. Nilai kembali fungsi baca () disimpan dalam pemboleh ubah panjang. Apabila nilai pemboleh ubah panjang lebih besar daripada sifar, satu atau lebih peristiwa telah berlaku.

Kami menggunakan SIG_INT isyarat (tekan Ctrl + C) untuk keluar dari proses. Apabila anda menekan Ctrl + C, the sig_handler () fungsi dipanggil (Lihat pengendalian isyarat untuk perincian). Fungsi ini membuang deskriptor jam tangan, menutup contoh inotify fd, dan keluar dari program.

Kesimpulannya

Anda boleh menggunakan Inotify API dalam aplikasi anda sendiri untuk pemantauan, penyahpepijatan, automasi, dan lain-lain, dengan cara anda sendiri. Di sini, kita telah melihat aliran pelaksanaan Inotify API.

5 Produk Tetikus Komputer Ergonomik Teratas untuk Linux
Adakah penggunaan komputer yang berpanjangan menyebabkan rasa sakit di pergelangan tangan atau jari anda? Adakah anda mengalami sendi kaku dan selalu ...
Cara Mengubah Tetapan Tetikus dan Pad Sentuh Menggunakan Xinput di Linux
Sebilangan besar pengedaran Linux dihantar dengan perpustakaan "libinput" secara lalai untuk menangani peristiwa input pada sistem. Ia dapat memproses...
Buat semula butang tetikus anda secara berbeza untuk perisian yang berbeza dengan X-Mouse Button Control
Mungkin anda memerlukan alat yang dapat mengubah kawalan tetikus anda dengan setiap aplikasi yang anda gunakan. Sekiranya ini berlaku, anda boleh menc...