Que fait ERESTARTSYS lors de l'écriture du pilote Linux?



Answers

Question

J'apprends sur les fonctions d'E / S de blocage pour l'écriture du pilote de périphérique Linux et je me demande quelle est l'utilisation d' ERESTARTSYS . Considérer ce qui suit:

Variable globale:

wait_queue_head_t my_wait_q_head;
int read_avail = 0;


device_init ():

init_waitqueue_head(&my_wait_q_head);


device_read ():

printk("I'm inside driver read!\n");
wait_event_interruptible(&my_wait_q_head, read_avail != 0);
printk("I'm awaken!\n");


device_write ():

read_avail = 1;
wake_up_interruptible(&my_wait_q_head);


Lorsque j'appelle read() dans l'espace utilisateur, l'invite de commande est bloquée jusqu'à ce que j'appelle write() comme prévu. Les messages printk apparaissent également dans dmesg . Cependant, je vois certains des pilotes écrits comme ceci:

Une autre version de device_read ():

printk("I'm inside driver read!\n");
if(wait_event_interruptible(&my_wait_q_head, read_avail != 0))    
{return -ERESTARTSYS;}
printk("I'm awaken!\n");

J'ai testé la deuxième version de device_read() utilisant la même méthode dans l'espace utilisateur, et le résultat est exactement le même, alors, quelle est l'utilité d'ERESTARTSYS?

p / s: J'ai lu le livre Linux Device Driver sur ce sujet mais je ne comprends pas, quelqu'un peut-il donner un exemple à eleborate ?:

Une fois que nous avons passé cet appel, quelque chose nous a réveillés, mais nous ne savons pas quoi. Une possibilité est que le processus a reçu un signal. L'instruction if qui contient l'appel wait_event_interruptible vérifie ce cas. Cette déclaration assure la réaction correcte et attendue aux signaux, qui auraient pu être responsables du réveil du processus (puisque nous étions dans un sommeil interruptible). Si un signal est arrivé et qu'il n'a pas été bloqué par le processus, le bon comportement consiste à laisser les couches supérieures du noyau gérer l'événement. À cette fin, le conducteur renvoie -ERESTARTSYS à l'appelant; cette valeur est utilisée en interne par la couche de système de fichiers virtuel (VFS), qui redémarre l'appel système ou renvoie -EINTR à l'espace utilisateur. Nous utilisons le même type de vérification pour traiter la gestion du signal pour chaque implémentation en lecture et en écriture.

Source: http://www.makelinux.net/ldd3/chp-6-sect-2




Links