Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

signal or sigaction : which is the best?

4 réponses
Avatar
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.

4 réponses

Avatar
Pim
Le 26 Feb 2011 09:32:15 GMT,
Pim disait ceci :

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.
Avatar
Mickaël Wolff
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 ===
Avatar
espie
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...
Avatar
Antoine Leca
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