Saya ingin diberitahu ketika nama file tertentu dibuat. Saya sedang melihat inotify
. The IN_CREATE
flag tersedia untuk memantau direktori untuk setiap perubahan di dalamnya, tapi aku lebih suka untuk tidak memantau seluruh direktori karena mungkin ada banyak kegiatan di direktori selain file saya tertarik. Hal ini dapat dilakukan ?
9
access
denganF_OK
untuk melihat apakah sudah ada.Jawaban:
Anda tidak dapat memiliki kernel yang hanya memberi tahu Anda tentang perubahan ke jalur tertentu. Alasannya agak halus:
Di Linux, objek file ada secara independen dari nama apa pun yang dimilikinya. Nama-nama file sebenarnya adalah atribut direktori yang mengandungnya, dan satu file dapat dipanggil dengan beberapa nama (lihat, hardlinking).
Kernel harus memiliki sesuatu untuk dilampirkan objek inotify; itu tidak bisa melampirkan objek ke pathname karena pathname bukan objek sistem file nyata; Anda harus melampirkan ke direktori induk atau file yang dijelaskan path. Tetapi Anda tidak dapat melampirkan ke file, karena Anda menonton untuk melihat apakah file dengan nama yang diberikan dibuat, bukan perubahan pada file yang diberikan.
Secara teoritis, kernel dapat mengimplementasikan API yang memungkinkan Anda memilih acara untuk pathname yang diberikan saat menambahkan arloji ke direktori, dengan cara yang sama memungkinkan Anda memilih jenis acara. Ini akan mengasapi API, dan kernel pada akhirnya akan memproses data yang sama dan melakukan perbandingan string yang sama dengan yang Anda lakukan di userspace.
Apakah ada kinerja yang nyata untuk menempatkan arloji di direktori yang sangat aktif? Saya tidak yakin seberapa aktif maksud Anda; puluhan file per detik, ratusan, jutaan?
Bagaimanapun, saya akan menghindari
access
: itu selalu akan berlomba. File dapat dibuat dan dihapus di antara panggilan keaccess
, dan memanggilaccess
dalam loop yang sangat ketat akan menjadi lambat, dan jenis masalahinotify
yang dirancang untuk dipecahkan.sumber
inotify
, dan apakah kinerja adalah masalah aktual.