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
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 ===
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 ===
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
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:
(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...
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:
(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...
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:
(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
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
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.
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.