TacOS-team / tacos

Système d'exploitation / Operating System
GNU General Public License v3.0
9 stars 4 forks source link

Syscalls ne doivent pas être interrompus par signaux mais... #232

Closed MaximeCheramy closed 9 years ago

MaximeCheramy commented 9 years ago

Actuellement, si un processus en cours d'exécution reçoit un signal, alors le handler est exécuté, peu importe si on était en train d'exécuter un syscall ou non.

Ceci est en réalité dangereux : le handler, développé par une appli tierce, peut par exemple décider d'interrompre le processus (exit) ou faire d'autres syscalls. Par exemple, si le handler fait un exit en plein milieu d'un write, alors il peut corrompre l'état logique du fichier (ou de la console).

Il est donc impératif de laisser le syscall se terminer proprement avant de laisser le handler s'exécuter.

Cependant, certains syscalls sont très lents et bloquent le processus pour diverses raisons. Une solution à ce problème est d'avoir un mécanisme pour permettre au syscall de s'apercevoir qu'un signal est pending et de se terminer plus tôt.

Sur les systèmes POSIX, l'erreur EINTR est renvoyée dans ce cas. Dans le cas d'une lecture/écriture, le nombre de caractères correctement lus/écrits sont renvoyés.

Pour commencer, je propose simplement d'attendre que le process soit en userland avant d'exécuter le handler.

NicolasFloquet commented 9 years ago

ça me va

MaximeCheramy commented 9 years ago

T'imagine même pas le nombre de bugs incompréhensibles que ces modifications légères ont provoqué :D.

NicolasFloquet commented 9 years ago

Si si :D

MaximeCheramy commented 9 years ago

Je ferme ce ticket mais il faudra adapter certains syscalls pour qu'ils puissent se terminer au plus vite. Et sleep devrait renvoyer le temps restant.