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

Shell et commandes GNU Discussion :

Explication de texte à propos du code en C de l'outil sync


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 134
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 134
    Par défaut Explication de texte à propos du code en C de l'outil sync
    Bonsoir,

    Je voulais en savoir plus sur la commande sync, j'ai donc téléchargé le paquet coreutils contenant le .c qui va bien, et je dois avouer que j'ai rarement vu aussi minimaliste (à part un helloworld) ; quand j'enlève tout ce qui concerne le parsing des options (ça tombe bien, sync n'a pas d'options) et l'internationalisation (inutile pour ce que je veux voir), il ne reste quasiment rien, et pourtant, si je poste ici, c'est que quelque chose m'échappe :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    /* The official name of this program (e.g., no `g' prefix).  */
    #define PROGRAM_NAME "sync"
     
    int
    main (int argc, char **argv)
    {
    /* c'est moi qui mets en commentaire tout ce bloc
      initialize_main (&argc, &argv);
      set_program_name (argv[0]);
      setlocale (LC_ALL, "");
      bindtextdomain (PACKAGE, LOCALEDIR);
      textdomain (PACKAGE);
     
      atexit (close_stdout);
     
      parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE, Version,
                          usage, AUTHORS, (char const *) NULL);
      if (getopt_long (argc, argv, "", NULL, NULL) != -1)
        usage (EXIT_FAILURE);
     
      if (optind < argc)
        error (0, 0, _("ignoring all arguments"));
    */
      sync ();
      exit (EXIT_SUCCESS);
    }
    Je ne mets pas le code de la proc void usage ni les include pour alléger.

    Et quand je regarde les deux lignes du main, surtout la 1re, deux questions me viennent à l'esprit :
    1- "sync ()" ça appelle... sync ? Pour appeler un prog depuis du C, c'est pas avec "system" ou la famille des "execv./execl." ?
    2- en admettant qu'on puisse l'appeler comme ça, on part pas dans une boucle folle et sans fin, là ?

    Un truc m'échappe vraiment, et pour essayer d'y voir clair j'ai dérivé de ce truc un prog essai.c :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdlib.h>
    #include <stdio.h>
     
    /* The official name of this program (e.g., no `g' prefix).  */
    #define PROGRAM_NAME "essai"
     
    int
    main (int argc, char **argv)
    {
      essai ();
      exit (0);
    }
    mais en fait, ça ne compile pas : gcc -o essai essai.c --> undefined reference to 'essai'.

    À partir de là je me sens un peu coincé et je viens chercher vos lumières !

    Ah, un dernier mot : j'ai utilisé locate pour voir les sync de ma machine (Debian 7 / 32 bits / Lxde), j'en ai trouvé 2, ça donne ça :
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /bin/sync
    /usr/lib/klibc/bin/sync
     
    # ls -Al /bin/sync 
    -rwxr-xr-x 1 root root 26152 janv. 26  2013 /bin/sync
    # ls -Al /usr/lib/klibc/bin/sync 
    -rwxr-xr-x 1 root root 532 nov.  12  2012 /usr/lib/klibc/bin/sync
     
    # file /bin/sync 
    /bin/sync: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x4d3c9dbd682f2cacf7f2d71f2b61b7595156286f, stripped
    # file /usr/lib/klibc/bin/sync 
    /usr/lib/klibc/bin/sync: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked (uses shared libs), stripped
    Pas bien utile pour le moment, mais je le mets quand même, sait-on jamais.

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut Jipété,

    la commande sync fait appel dans son code source à la fonction sync() !

    sync est le nom d'une commande système, mais il tire son nom de l'appel système correspondant en fait, c'est la différence entre man 1 sync et man 2 sync

    dans ton programme tu essayes d'appeler une fonction essai() qui n'existe pas, du coup ça lève une erreur de compilation 'undefined reference'


  3. #3
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Tu cherches quoi ? ou


    La fonction sync


    Édit: Et en plus c'est un tout petit peu crade : l'appel devrait être sync(void);

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 134
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 134
    Par défaut
    Salut les copains,

    et merci de vos retours rapides comme l'éclair

    Citation Envoyé par BufferBob Voir le message
    la commande sync fait appel dans son code source à la fonction sync() !

    sync est le nom d'une commande système, mais il tire son nom de l'appel système correspondant en fait, c'est la différence entre man 1 sync et man 2 sync
    Faudrait que j'arrête d'essayer de coder quand il fait chaud comme ça, sans déc', j'ai le cerveau qui fait des bulles

    Citation Envoyé par foetus Voir le message
    Et en plus c'est un tout petit peu crade : l'appel devrait être sync(void);
    Oh ben c'est pas moi qui l'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define AUTHORS proper_name ("Jim Meyering")
    Citation Envoyé par foetus Voir le message
    Tu cherches quoi ? ou
    À essayer de comprendre pourquoi et comment sync fonctionne car un truc me reste en travers de la gorge depuis un peu plus d'un an, et qu'on a discuté ici, et je n'ai toujours pas compris pourquoi Escapetiger disait
    On peut même essayer de blinder la commande par sync ; sync ; wait
    Mais peut-être que j'ai du temps à perdre ? Avec cette chaleur il n'y a que ça à faire, de toute façon...
    (nan, c'est pas vrai, c'est pour optimiser un script de sauvegarde )

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par Jipété Voir le message
    je dois avouer que j'ai rarement vu aussi minimaliste (à part un helloworld) ; quand j'enlève tout ce qui concerne le parsing des options (ça tombe bien, sync n'a pas d'options) et l'internationalisation (inutile pour ce que je veux voir), il ne reste quasiment rien
    Tu devrais regarder le code source de true.c ou mieux false.c pour trouver encore plus minimaliste...

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 134
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 134
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    Tu devrais regarder le code source de true.c ou mieux false.c pour trouver encore plus minimaliste...


    Et pour tout le monde, false.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define EXIT_STATUS EXIT_FAILURE
    #include "true.c"
    C'est tout !
    Et mine de rien, la compilation de ces deux lignes génère un binaire de... 71,4 ko quand même, hein ! Truc de ouf !

Discussions similaires

  1. Explication de texte ou de code
    Par jodan33 dans le forum Débuter
    Réponses: 3
    Dernier message: 17/03/2008, 13h35
  2. explication sur un bout de code
    Par poporiding dans le forum C++
    Réponses: 2
    Dernier message: 27/06/2006, 18h04
  3. [Tableaux] Explication d'une ligne de code
    Par eXiaNazaire dans le forum Langage
    Réponses: 3
    Dernier message: 30/03/2006, 13h09
  4. Tags : explication de texte
    Par Auteur dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 2
    Dernier message: 02/12/2005, 10h07
  5. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51

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