• # Quelques solutions

    Posté par . En réponse au message Signal depuis un driver vers une application. Évalué à 4.

    On peut imaginer plein de moyens pour faire ce genre de choses :

    - Le plus simple : un driver en mode caractère par exemple accessible par /dev/myeventmanager qui bloque sur un read(). Lorsque ton driver a besoin de signaler un event, il va utiliser le driver derrière /dev/myeventmanager pour débloquer le read et passer une structure du type

    struct myevent {
    u32 type;
    union {
    u32 arg_type1;
    u16 arg_type2;
    };
    };

    au processus qui vient de se faire débloquer pour lui dire quel event on vient d'émettre. Biens sûr il est possible d'améliorer l'idée :

    - rajouter le support de select(), poll(), epoll()
    - se faire une API dans le driver associé à /dev/myeventmanager pour que le
    reste du noyau puisse envoyer facilement des events.
    - ...

    - Le "vieux" moyen de faire ça est d'utiliser les signaux UNIX, le driver balance un signal lorsqu'il le souhaite à un processus qui c'est enregistré (par le moyen d'un open() ou d'un ioctl par exemple) au préalable

    - On peut essayer d'utiliser une socket netlink.

    - On peut tenter de regarder dans les nouveaux syscall pour supporter des events qui viennent du noyau :
    - kevent (aujourd'hui mort)
    - signalfd()

    piiioufff ça en fait des solutions. Reste plus qu'a débroussailler tout ça.