Bonjour Chers participants stackoverflow,mise en œuvre du mécanisme dans le sondage Char Device Driver
Je suis nouveau au développement de l'espace noyau et encore au début de la route. J'ai développé un pilote de périphérique char de base qui peut lire ouvert fermer etc. Mais n'a pas pu trouver une source appropriée et comment tutoriel pour l'échantillon de mécanisme de sondage/sélection.
J'ai écrit l'exemple de code pour la fonction de sondage ci-dessous:
static unsigned int dev_poll(struct file * file, poll_table *wait)
{
poll_wait(file,&dev_wait,wait);
if (size_of_message > 0){
printk(KERN_INFO "size_of_message > 0 returning POLLIN | POLLRDNORM\n");
return POLLIN | POLLRDNORM;
}
else {
printk(KERN_INFO "dev_poll return 0\n");
return 0;
}
}
Il fonctionne très bien, mais ne pouvait pas undestand quelques choses.
Lorsque j'appelle selection de programme de l'espace utilisateur comme
struct timeval time = {5,0 } ;
select(fd + 1 , &readfs,NULL,NULL,&time);
la fonction dev_poll dans conducteur appelé une fois et retour à zéro ou POLLIN afin de taille de mémoire tampon. Et puis plus jamais appelé. Dans l'espace utilisateur, après 5 secondes le programme continue si dev_poll a renvoyé 0. Ce que je ne pouvais pas comprendre est ici, comment le code de conducteur décidera et laissera l'espace d'utilisateur programme s'il y a quelque chose dans le tampon qui est lisible pendant ces 5 secondes, s'il est appelé une fois et retourné immédiatement.
Y at-il de toute façon dans le module du noyau de recueillir des informations sur le paramètre timeval qui vient de l'espace utilisateur?
Merci à partir de maintenant.
Cordialement,
Merci pour votre réponse, Alors comment dois-je gérer les situations pour laisser le noyau quand j'ai des données disponibles avec le délai? À titre d'exemple, sélectionnez l'appel de l'espace utilisateur avec une temporisation de 5 s. Au début de la sélection, je n'ai aucune donnée dans l'appareil. Ensuite, j'ai les données avec 2 secondes. Donc, je veux réveiller le programme de l'espace utilisateur. Comment je peux mettre en œuvre ceci? – Ozan
Comme indiqué dans la réponse, lorsque la file d'attente devient non vide, vous devez appeler 'wake_up' pour la file d'attente que vous utilisez pour' poll'. – Tsyvarev