Pemrograman C

Cara Menggunakan API inotify dalam Bahasa C

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

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

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

  1. Buat instance inotify menggunakan inotify_init()
  2. Tambahkan path lengkap direktori atau file untuk dipantau dan acara untuk ditonton menggunakan fungsi inotify_add_watch(). Dalam fungsi yang sama, kami menentukan acara mana (ON CREATE, ON ACCESS, ON MODIFY dll.), perubahan pada file, atau perubahan pada direktori harus dipantau.
  3. Tunggu hingga peristiwa terjadi dan baca buffer, yang berisi satu atau lebih peristiwa yang terjadi, menggunakan using Baca() atau Pilih()
  4. Proses event yang sudah terjadi, lalu kembali ke langkah 3 untuk menunggu event lainnya, dan ulangi.
  5. Hapus deskriptor jam tangan menggunakan inotify_rm_watch()
  6. Tutup instance inotify.

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

File tajuk: sys/beri tahu.h

inotify_init() fungsi:

Sintaks: int inotify_init (void)

Argumen: Tidak ada argumen.

Nilai Pengembalian: Saat berhasil, fungsi mengembalikan deskriptor file baru, jika gagal fungsi mengembalikan -1.

inotify_add_watch() fungsi:

Sintaksis: int inotify_add_watch ( int fd, const char *nama path, uint32_t mask )

Argumen:

Fungsi ini membutuhkan tiga argumen.

1st argumen (fd) adalah deskriptor file yang merujuk ke instance inotify (nilai pengembalian inotify_init() fungsi) .

2dan argumen adalah jalur direktori atau file yang sedang dipantau.

3rd argumen adalah bitmask. Bitmask mewakili peristiwa yang sedang ditonton. Kita dapat menonton satu atau lebih acara menggunakan bitwise-ATAU.

Nilai Kembali: Saat berhasil, fungsi mengembalikan deskriptor arloji, untuk kegagalan fungsi mengembalikan -1.

inotify_rm_watch() fungsi:

Sintaksis: int inotify_rm_watch ( int fd, int32_t wd )

Argumen:

Fungsi ini membutuhkan dua argumen.

1st argumen (fd) adalah deskriptor file yang merujuk ke instance inotify (nilai pengembalian inotify_init() fungsi) .

2dan argumen (wd) adalah deskriptor arloji (nilai kembalian inotify_add_watch()  fungsi) .

Nilai Kembali:  Saat berhasil, fungsi mengembalikan 0, untuk kegagalan fungsi mengembalikan -1.

Kita gunakan Baca() fungsi (dideklarasikan dalam unistd.h header file) untuk membaca buffer, yang menyimpan informasi tentang peristiwa yang terjadi dalam bentuk inotify_event struktur. Itu inotify_event struktur dideklarasikan dalam sys/beri tahu.h berkas kepala:

struct inotify_event
int32t   wd;
uint32_t  topeng;
kuki uint32_t ;
uint32_t  len;
nama karakter[];

Itu inotify_event struktur mewakili acara sistem file yang dikembalikan oleh sistem inotify dan berisi anggota berikut:

Di bawah ini adalah contoh kerja, menggunakan Inotify API:

beri tahu.file c:

#termasuk
#termasuk
#termasuk
#termasuk
#termasuk
#termasuk // perpustakaan untuk fungsi fcntl
 
#define MAX_EVENTS 1024  /* Jumlah maksimum peristiwa untuk diproses*/
#define LEN_NAME 16  /* Dengan asumsi bahwa panjang nama file
tidak akan melebihi 16 byte*/
#define EVENT_SIZE  ( sizeof (struct inotify_event) ) /*size of one event*/
#define BUF_LEN     ( MAX_EVENTS * ( EVENT_SIZE + LEN_NAME ))
/*buffer untuk menyimpan data event*/
 
int fd,wd;
 
void sig_handler(int sig)
 
/* Langkah 5. Hapus deskriptor arloji dan tutup instance inotify*/
inotify_rm_watch(fd,wd);
tutup(fd);
keluar( 0 );
 

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

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

 
 
sementara(1)
 
int i=0,panjang;
char buffer[BUF_LEN];
 
/* Langkah 3. Baca penyangga*/
panjang = baca(fd,buffer,BUF_LEN);
 
/* Langkah 4. Memproses peristiwa yang telah terjadi */
ketika saya 
struct inotify_event *event = (struct inotify_event *) &buffer[i];
 
jika(acara->len)
if ( event->masker & IN_CREATE )
if ( event->masker & IN_ISDIR )
printf("Direktori %s telah dibuat.\n", acara->nama );

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


else if ( event->mask & IN_DELETE )
if ( event->masker & IN_ISDIR )
printf("Direktori %s telah dihapus.\n", acara->nama );

lain
printf("File %s telah dihapus.\n", acara->nama );


else if ( event->mask & IN_MODIFY )
if ( event->masker & IN_ISDIR )
printf("Direktori %s telah diubah.\n", acara->nama );

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



i += EVENT_SIZE + event->len;


Keluaran:

Untuk menjalankan program dan melihat outputnya, pertama-tama kita harus membuka dua terminal. Satu terminal digunakan untuk menjalankan program beri tahu.c. Di terminal kedua, kami pergi ke jalur yang sedang diawasi oleh Inotify.c. Jika kita membuat direktori atau file apa pun, memodifikasi file apa pun, atau menghapus direktori atau file apa pun, kita akan melihatnya di terminal pertama.

Dalam beri tahu.c contoh, unistd.h File header digunakan untuk Baca() dan Menutup() fungsi, stdlib.h File header digunakan untuk keluar() fungsi, sinyal.h File header digunakan untuk sinyal() fungsi dan SIG_INT makro (Lihat penanganan sinyal untuk detailnya), dan fcntl.h File header digunakan untuk fcntl() fungsi.

Kami menyatakan fd (beri tahu instance) dan wd (watch deskriptor) sebagai variabel global sehingga variabel ini dapat diakses dari semua fungsi.

Itu fcntl() fungsi tersebut digunakan agar pada saat kita membaca menggunakan fd deskriptor, utas tidak akan diblokir.

Selanjutnya, kami menambahkan jam tangan menggunakan inotify_add_watch() fungsi. Di sini, kami melewati fd, jalur direktori yang akan ditonton, dan topengnya. Anda dapat melewati topeng acara yang ingin Anda pantau menggunakan bitwise-ATAU.

Sekarang, baca buffernya. Informasi tentang satu atau lebih peristiwa disimpan dalam buffer. Anda dapat memproses semua acara satu per satu menggunakan loop. Anda dapat memeriksa acara->topeng untuk mengetahui jenis acara yang telah terjadi.

Kami menggunakan loop while tak terbatas untuk terus memeriksa kapan peristiwa terjadi. Jika tidak ada peristiwa yang terjadi, fungsi read() akan kembali dengan  0. Nilai kembalian fungsi read() disimpan dalam variabel panjang. Ketika nilai variabel panjang lebih besar dari nol, satu atau lebih peristiwa telah terjadi.

Kami menggunakan SIG_INT sinyal (tekan Ctrl+C) untuk keluar dari proses. Saat Anda menekan Ctrl+C, tombol sig_handler() fungsi dipanggil (Lihat penanganan sinyal untuk detailnya). Fungsi ini menghapus deskriptor arloji, menutup instance inotify fd, dan keluar dari program.

Kesimpulan

Anda dapat menggunakan Inotify API di aplikasi Anda sendiri untuk memantau, men-debug, otomatisasi, dan lainnya, dengan cara Anda sendiri. Di sini, kita telah melihat alur eksekusi dari Inotify API.

SuperTuxKart untuk Linux
SuperTuxKart adalah judul hebat yang dirancang untuk memberi Anda pengalaman Mario Kart gratis di sistem Linux Anda. Ini cukup menantang dan menyenang...
Pertempuran untuk Tutorial Westnoth
The Battle for Wesnoth adalah salah satu game strategi open source terpopuler yang bisa kamu mainkan saat ini. Tidak hanya game ini telah dikembangkan...
0 A.D. tutorial
Dari sekian banyak game strategi di luar sana, 0 A.D. berhasil menonjol sebagai judul yang komprehensif dan permainan taktis yang sangat dalam meskipu...