GNU/Linux >> Tutoriales Linux >  >> Linux

evento de conexión/desconexión usb de linux

Puedes usar libudev o analizar udevadm salida como sugirió @Ambroz Bizjak. Aunque, desaconsejo agregar un proceso adicional (stdbuf ) e idioma (NCD ), solo para analizar la salida de udevadm.

Un paso entre libudev simple y la salida de análisis es modificar las fuentes de udevadm. Esta solución reduce los recursos necesarios y omite el proceso de análisis por completo. Cuando mire el paquete udev, encontrará las fuentes para udevd y udevadm en el udev directorio.

Ahí tienes la rutina principal en udevadm.c y la fuente de udevadm monitor en udevadm-monitor.c . Cada evento recibido se imprimirá a través de print_device() . Aquí es donde inserta su código.

Si tiene poca memoria, puede eliminar el código innecesario para control , info , settle , test-builtin , test y trigger . En mi sistema (Ubuntu 12.04), esto reduce el tamaño de udevadm en aproximadamente un 75 %.


Desafortunadamente, no se produce ningún evento udev en la conexión/desconexión del dispositivo, por lo que es casi imposible monitorear estos eventos.
Puede monitorear los mensajes del kernel (dmesg). Parece ser una idea estúpida. O mire algunos archivos en sysfs. Quizá la mejor forma sea aplicar parches al kernel.

actualización: No entiendo por qué esta respuesta tiene muchos votos negativos.
Tal vez algunas personas mezclen la parte del host USB (que produce eventos UDEV al conectar/desconectar el dispositivo) y la parte del dispositivo/dispositivo USB (que no produce tales eventos)
Si su host de Linux funciona como un dispositivo (dispositivo USB que está conectado a algún host USB), no hay una buena manera de detectar eventos de conexión/desconexión.

Prueba:mensaje de Greg Kroah-Hartman
otra copia si el enlace anterior está caído


Si quiere todo en su proceso único, tendrá que usar libudev para obtener eventos de udevd o directamente desde el kernel.

Al ver que puede ser un problema usar libudev en su aplicación (¿falta de documentación?), una alternativa es usar el programa udevadm, que puede:

  • informar eventos del dispositivo después de ser procesados ​​por udevd (udevadm monitor --udev --property ),
  • informar eventos de devive directamente desde el kernel (udevadm monitor --kernel --property ), y
  • volcar la base de datos de udevd de los dispositivos actuales (¡pero no los del kernel!) (udevadm info --query all --export-db )

udevadm es parte del paquete udev, pero no debería necesitar udevd si solo lo usa para informar eventos del kernel. Puede usarlo haciendo que su proceso lo genere y analice su salida estándar (pero tendrá que iniciarlo a través de stdbuf -o L ).

De cualquier manera, probablemente será mucho trabajo. Ya he implementado mucho de esto en mi lenguaje de programación NCD, incluido el monitoreo de dispositivos USB. Es posible que desee echar un vistazo a NCD; es útil para muchas tareas de configuración y maneja bien la conexión en caliente. Por ejemplo, este programa NCD imprimirá los eventos del dispositivo USB en la salida estándar:

process main {
    sys.watch_usb() watcher;
    println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id);
    watcher->nextevent();
}

Esto hará que NCD imprima algo así (con un added inicial evento para cualquier dispositivo USB que ya estaba enchufado):

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

También puede usar NCD solo para esto y analizar this salida estándar, con la que es mucho más fácil trabajar que jugar con udevadm directamente.

Tenga en cuenta que el propio NCD usa udevadm , y lo hace requiere que udevd se esté ejecutando; pero ¿por qué es eso un problema de todos modos? (con algo de trabajo, esta dependencia podría eliminarse)


Linux
  1. 3 amadas distribuciones de Linux con unidades USB

  2. Cifrar unidad USB en Linux:paso a paso

  3. Ejemplos de comandos udevadm en Linux

  4. Lectura de flujo de entrada USB en Linux

  5. Linux, sockets, conexión sin bloqueo

Creando un Live USB de Manjaro Linux en Windows y Linux

Cómo crear un USB en vivo de Antergos Linux

Cómo crear un USB de arranque de Windows 10 en Linux

Instalar Linux Mint desde USB

Banda ancha USB:cómo conectar dispositivos de módem USB en Linux

¿Cómo crear un USB Kali Linux de arranque?