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
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.
# Quelques solutions
Posté par Damien Lespiau . En réponse au message Signal depuis un driver vers une application. Évalué à 4.
- 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.