Anda dapat menggunakan libudev
atau parsing udevadm
keluaran seperti yang disarankan @Ambroz Bizjak. Meskipun demikian, saya menyarankan untuk tidak menambahkan proses tambahan (stdbuf
) dan bahasa (NCD
), hanya untuk mengurai keluaran udevadm.
Langkah antara libudev biasa dan output parsing adalah memodifikasi sumber udevadm. Solusi ini mengurangi sumber daya yang dibutuhkan dan melewati proses parsing sama sekali. Saat Anda melihat paket udev, Anda akan menemukan sumber untuk udevd dan udevadm di udev
direktori.
Di sana, Anda memiliki rutinitas utama di udevadm.c
dan sumber untuk udevadm monitor
di udevadm-monitor.c
. Setiap event yang diterima akan dicetak melalui print_device()
. Di sinilah Anda memasukkan kode Anda.
Jika Anda kekurangan memori, Anda dapat menghapus kode yang tidak diperlukan untuk control
, info
, settle
, test-builtin
, test
dan trigger
. Di sistem saya (Ubuntu 12.04), ini mengurangi ukuran udevadm sekitar 75%.
Sayangnya, tidak ada acara udev yang dihasilkan di sambungkan/putuskan di sisi gadget, jadi hampir tidak mungkin untuk memantau acara ini.
Anda dapat memantau pesan kernel (dmesg). Sepertinya itu ide yang bodoh. Atau tonton beberapa file di sysfs. Mungkin cara yang lebih baik adalah menambal kernel.
perbarui: Saya tidak mengerti mengapa jawaban ini mendapat banyak suara negatif.
Mungkin beberapa orang mencampur bagian host USB (yang menghasilkan peristiwa UDEV pada plug/cabut perangkat) dan bagian perangkat/gadget USB (yang tidak menghasilkan peristiwa seperti itu)
Jika host linux Anda berfungsi sebagai gadget (perangkat USB yang terhubung ke beberapa host USB), tidak ada cara yang baik untuk menangkap peristiwa pasang/lepas.
Bukti:pesan oleh Greg Kroah-Hartman
salinan lain jika tautan sebelumnya mati
Jika Anda menginginkan semuanya dalam satu proses, Anda harus menggunakan libudev untuk mendapatkan acara dari udevd
atau langsung dari kernel.
Melihat bahwa penggunaan libudev dalam aplikasi Anda mungkin menjadi masalah (kurangnya dokumentasi?), alternatifnya adalah menggunakan program udevadm, yang dapat:
- laporkan peristiwa perangkat setelah diproses oleh
udevd
(udevadm monitor --udev --property
), - laporkan peristiwa deveve langsung dari kernel (
udevadm monitor --kernel --property
), dan - dump database udevd dari perangkat saat ini (tetapi bukan kernel!) (
udevadm info --query all --export-db
)
udevadm
adalah bagian dari paket udev, tetapi tidak memerlukan udevd
jika Anda hanya menggunakannya untuk melaporkan peristiwa kernel. Anda dapat menggunakannya dengan meminta proses Anda menelurkannya dan mengurai keluaran standarnya (tetapi Anda harus meluncurkannya melalui stdbuf -o L
).
Either way, itu mungkin akan banyak pekerjaan. Saya sudah menerapkan banyak hal ini dalam bahasa pemrograman NCD saya, termasuk pemantauan perangkat USB. Anda mungkin ingin melihat NCD; ini berguna untuk banyak tugas konfigurasi, dan menangani hotplugging dengan baik. Misalnya, program NCD ini akan mencetak aktivitas perangkat USB ke keluaran standar:
process main {
sys.watch_usb() watcher;
println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id);
watcher->nextevent();
}
Ini akan membuat NCD mencetak sesuatu seperti itu (dengan added
awal acara untuk perangkat USB apa pun yang sudah terpasang):
added /dev/bus/usb/002/045 0409:0059
added /dev/bus/usb/002/046 046d:c313
added /dev/bus/usb/002/047 046d:c03e
added /dev/bus/usb/002/048 0557:2008
removed /dev/bus/usb/002/048 0557:2008
Anda juga dapat menggunakan NCD hanya untuk ini, dan mengurai ini output standar - yang jauh lebih mudah untuk dikerjakan daripada mengotak-atik udevadm secara langsung.
Perhatikan bahwa NCD itu sendiri menggunakan udevadm
, dan itu melakukannya membutuhkan udevd untuk berjalan; tapi kenapa itu jadi masalah sih? (dengan beberapa pekerjaan ketergantungan ini dapat dihapus)