IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

POSIX C Discussion :

Compilation avec -ansi : SA_RESTART undeclared


Sujet :

POSIX C

  1. #1
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut Compilation avec -ansi : SA_RESTART undeclared
    Salut à toutes et à tous.

    J'ai terminé et remis tantôt un projet pour mon cours de UNIX. Il s'agissait d'utiliser les IPC : semaphores, mémoires partagées, sockets...

    Dans l'ensemble, ça s'est pas mal passé, mais quelques questions subsistent. Elles concernent l'option -ansi de notre ami gcc.

    Pour info, je bosse sous Ubuntu 10.04 64 bits, et voici ce qu'affiche gcc -v :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    antoine@Aspyct:~$ gcc -v
    Using built-in specs.
    Target: x86_64-linux-gnu
    Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
    --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib
    --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4
    --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i486
    --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
    Thread model: posix
    gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
    Ce que je vous décris plus bas ne se passe que si l'option -ansi est utilisée pour compiler.

    Bien, le décors est placé, voici mes questions :
    1. contraint et forcé par <sys/ipc.h>, j'ai du mettre l'option -D_XOPEN_SOURCE. À quoi sert-elle exactement ?
    2. SA_RESTART semble bien poser des soucis. Voyez par vous même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <signal.h>
     
    int
    main()
    { int flags = SA_RESTART;
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    antoine@Aspyct:~$ gcc sa_restart.c 
    antoine@Aspyct:~$ gcc -ansi sa_restart.c 
    sa_restart.c: In function ‘main’:
    sa_restart.c:5: error: ‘SA_RESTART’ undeclared (first use in this function)
    sa_restart.c:5: error: (Each undeclared identifier is reported only once
    sa_restart.c:5: error: for each function it appears in.)
    antoine@Aspyct:~$ gcc -ansi -D_XOPEN_SOURCE sa_restart.c 
    sa_restart.c: In function ‘main’:
    sa_restart.c:5: error: ‘SA_RESTART’ undeclared (first use in this function)
    sa_restart.c:5: error: (Each undeclared identifier is reported only once
    sa_restart.c:5: error: for each function it appears in.)
    D'après ce que j'ai pu lire sur le net, il s'agirait d'une sorte de conflit du standard avec les headers actuels (info à vérifier). Qu'en est-il exactement ? sigaction fait-il partie du passé ? Et comment résoudre cette erreur de compilation ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 377
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 377
    Points : 23 663
    Points
    23 663
    Par défaut
    Bonsoir,

    Citation Envoyé par Antoine_935 Voir le message
    1. contraint et forcé par <sys/ipc.h>, j'ai du mettre l'option -D_XOPEN_SOURCE. À quoi sert-elle exactement ?
    Cela sert à préciser de manière officielle la norme sur laquelle ton programme s'aligne.

    Une myriade de systèmes Unix plus ou moins compatibles entre eux ont vu le jour depuis UNICS de fin 1969. Elle est mise en évidence par cette célèbre fresque.

    Pour simplifier, deux grandes branches se sont développées : la branche SysV et la branche BSD, qui a fait un travail considérable. Depuis, même si chaque système apporte son propre lot de particularités, on peut quand même dire qu'ils appartiennent tous à une de ces deux familles, même si la tendance actuelle est de fusionner les deux et de proposer systématiquement les appels les plus populaires.

    Le problème, c'est qu'il existe quelques appels similaires, voire homonyme, dans des branches différentes mais dont la signature et/ou le comportement diffère. Il y a donc ambiguïté et il faut trancher.

    Il existe également des mécanismes qui sont − en principe − propres à certaines branches. C'est le cas des sockets, par exemple, qui à l'origine sont typiquement BSD.

    En temps normal, les systèmes modernes sont capables de tout proposer et de retomber sur leurs pieds. Mais si tu veux faire de la compilation stricte, ou si l'ambigüité ne peut être résolue automatiquement, il faut que tu définisses une macro précisant la norme que ton programme suit, ainsi que sa version. C'est en général indiqué en haut des man pages. La plupart du temps, c'est XOpen, BSD ou Posix.

    2. SA_RESTART semble bien poser des soucis. Voyez par vous même:
    Extrait de la man page de sigaction() :

    Citation Envoyé par man 2 sigaction
    SA_RESTART
    Fournir un comportement compatible avec la sémantique BSD en redémarrant automatiquement les appels systèmes lents interrompus par l'arrivée du signal.

    Par défaut, Linux est compatible SysV.

  3. #3
    Membre éprouvé
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Points : 1 066
    Points
    1 066
    Par défaut
    Merci pour cette enrichissante réponse

    Donc, si j'ai bien compris : Sous Linux, -ansi force à utiliser la norme SysV, qui n'avait pas prévu le SA_RESTART. D'où l'erreur à la compilation. C'est bien ça ?

Discussions similaires

  1. Comment compiler non-ANSI avec gcc ?
    Par dva2tlse dans le forum Linux
    Réponses: 6
    Dernier message: 21/01/2012, 12h53
  2. Réponses: 1
    Dernier message: 29/10/2003, 12h16
  3. Problemes de compilation avec g++ sous linux
    Par Selimmel dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 19/09/2003, 13h43
  4. [JB9][EJB]Compiler avec Make ou javac ?
    Par _gtm_ dans le forum JBuilder
    Réponses: 4
    Dernier message: 11/07/2003, 15h59
  5. Compilation avec un Makefile
    Par Mau dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 28/02/2003, 11h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo