Auteur: Francois-Xavier Kowalski Date: À: Frederic Giroud CC: ML Guilde Sujet: l'implementation de Linus [Was: Re: Interruptions en C++]
Salut,
Frederic Giroud wrote:
> Salut,
>
>>Comment utilise-t-on (si c'est possible), les fonctions de mise en place
>>des interruptions (alarm(), raise(), kill(), signal() et les sigxxx()) en
>>
>>C++ ?
>>
>
> ca va pas etre facile, ce sont des fonctions C
>
Les invoquer depuis C++ ne devrait pas poser de probleme, a qq flags de
pre-compil pres, probablement.
>>Par exemple, peut-on passer la methode d'un objet particulier a la
>>fonction signal() ?
>>
>
> non, ca marchera jamais a moins que ce ne soit une methode "static"
> comme ayant la meme signature qu'un handler normal.
>
Je ne vois-pas ce que tu veux dire par "signature". Si c'est du symboles
dont tu parles, il n'a pas d'impact: c'est un pointeur qui est passer
comme handler de signal.
Maintenant, une methode reference potentiellement les variables de la
classe, ce qui est impossible en passant un pointeur sur methode (les
variables n'ont pas suivi la methode). Peut-etre est-ce cela que tu
designes par "signature".
Autre proposition: utiliser un fonction handler - correspondant au
prototype attendu par sigXXX - declaree en "friend" de la classe. Cela
me parait meme plus "propre" qu'une methode statique.
>>Sinon, est-il possible, dans la fonction C qui servira de handler dans
>>signal(), de creer un objet C++ et d'appeler des methodes de celui-ci ?
>>
Pas de probleme, aux problemes de re-entrance prest, soulignes
ci-dessous. Une solution est celle du utilisee par le noyau Linux, au
court du traitement des interruption materielles: les "Bottom-Halves"
(BH) (recement remplacees par les tasklets, ce qui est moins expressif
comme denomination).
Ton gestionnaire de signal enregistre dans une liste - globale au
process - une fonction a executer accompagnee d'un ou plusieurs
parametres & rends la main immediatement. L'enregistrement est realise
dans un tableau indexe par la valeur du signal (si plusieurs signaux
recus peuvent etre traites par un seul BH) ou dans une liste chaine (si
il faut executer un exemplaire de la fonction par signal recu). Plus
loin dans ta boucle principale - j'imagine qu'il y en a une si les
signaux doivent etre traites - tu depile les BH enregistrees.
Il faut quand meme geree la re-entrance (voir la precedente reponse plus
bas) dans ton gestionnaire de signaux, mais la section critique est plus
courte & n'impacte pas les donnees internes de ton programme.
>cela depend de ce que fait ton programme.
> s'il ne fait rien (sleep, read, wait...) cela pourra etre fait sans
> probleme.
> sinon, tu risques de faire des allocations re-entrantent (ou tout
> autres fonctions ne supportant pas la re-entrance) et la, c'est
> plus complique. (mais ce n'est pas impossible a faire avec les
> fonctions "sigmask")
> --
Francois-Xavier KOWALSKI