signal or sigaction : which is the best?

Le
Pim
Hi all.

I wonder wich of signal or sigaction is the best.

They say that signal is ANSI C and sigaction is POSIX.

Could you explain me what are the consequences of this?

Thanks in advance.

Pim.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Pim
Le #23158761
Le 26 Feb 2011 09:32:15 GMT,
Pim
Hou la la, c'est un forum français désolé.

Je me demande quelle est la différence entre signal et sigaction.
J'ai lu que signal est ANSI C et que sigaction est POSIX.

Pouvez-vous me dire quelles en sont les conséquences?

Merci.
Mickaël Wolff
Le #23158841
On 26/02/11 10:25, Pim wrote:
Pouvez-vous me dire quelles en sont les conséquences?



Tu as lu les manuels des fonctions ? Parce que dans le man Linux de
signal stipule :

=== 8< == The behavior of signal() varies across Unix versions, and has also var‐
ied historically across different versions of Linux. Avoid its use:
use sigaction(2) instead. See Portability below.
=== >8 ===
espie
Le #23160221
De facon un peu plus detaillee, historiquement, signal() n'est pas "fiable"
sur tous les Unix. Le principal probleme etant que la reception d'un signal
"desarme" systematiquement le gestionnaire. D'ou les vieux codes qui font:

void handler(int sig)
{
signal(sig, handler);
/* vraie action */
}

(avec evidemment une race condition entre l'entree dans le handler et le
moment ou on passe par sigaction).

sigaction permet d'etre bien plus precis la-dessus...

Apres, il y a du pour et du contre:
- sigaction n'est pas forcement la, donc signal comme solution de base.
- sur une enorme partie des systemes qui ont sigaction et qui existent encore,
signal est fiable.

La preconisation habituelle, c'est de tester (a la autoconf) si sigaction est
present et de s'en servir s'il est la, et de passer par signal() sinon.

La preconisation moderne, ca serait de s'en foutre un peu. Il ne reste plus
grand chose comme systeme "vivant" ou signal() va poser des problemes, et
sigaction() est present sur tous ces systemes. Du coup, ca n'a plus grande
importance...
Antoine Leca
Le #23163771
Pim écrivit :
Je me demande quelle est la différence entre signal et sigaction.
J'ai lu que signal est ANSI C et que sigaction est POSIX.

Pouvez-vous me dire quelles en sont les conséquences?



La portabilité.

Si tous tes systèmes cibles sont POSIX (autrement dit, genre *nix,
incluant Linux, TousLesBSD et Mac OS X, et aussi Cygwin ou SUA), tu peux
utiliser sigaction(2), qui offre plus de possibilités.

Si certains de tes systèmes cible ne supportent pas cette norme (exemple
au hasard : Windows « normal »), sigaction() ne sera pas disponible, et
la seule possibilité restante sera signal tel que normalisé par la norme
ISO C (qui est de plus large application).

Suivant le choix, tu suivras l'une ou l'autre des normes pour
l'utilisation de la fonction, ce qui devrait rendre ton programme
portable sur tous les systèmes conformes avec la dite norme.


Antoine
Publicité
Poster une réponse
Anonyme