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

C Discussion :

Fonction controlant l'unicite d'un script


Sujet :

C

  1. #1
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut Fonction controlant l'unicite d'un script
    Bonjour ou bonsoir à toutes et à tous.

    Travaillant sous Unix en C, j'ai développé une petite fonction pour controler l'unicite d'un script.

    Code : 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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /**************************************************
    * Fonction : ControlerUniciteScript
    *							
    * Description : 
    * Controle l'unicite du traitement lance
    * 
    * Syntaxe : 
    * void ControlerUniciteScript(char szNomScript[], FILE * pfLog)
    *
    * Arguments :
    * - char szNomScript[] : Nom du traitement
    * - FILE * pfLog : handle du fichier de log
    * 			   					
    * Val. Retour	:  
    * -
    *								
    *******************************************************/
    void ControlerUniciteScript(char szNomScript[], FILE * pfLog)
    {
        int  i;
        int  j = 0;
        char szBufferCommande[50];
        char szBuffer[50];
        char szBufferSortie[50];
        FILE * pfPop;
    
        sprintf(szBufferCommande, "ps -a | grep %s | wc -l", szNomScript);
        pfPop = popen(szBufferCommande, "r");
        if (pfPop == (FILE *) NULL)
        {
            /*Remplir le fichier de log sur ce cas d'erreur */;
        }
    
        while(fgets(szBuffer, sizeof(szBuffer), pfPop) != (char *) NULL)
        {
            szBuffer[strlen(szBuffer)-1] = '\0' ;
            trim(szBuffer, szBufferSortie);
            
            if(strcmp(szBufferSortie, "1") != 0)
            {
                /* remplir le fichier de log sur ce cas d'erreur */
            }
        }
    }
    Pour la fonction trim, cf : Fonction trim

    Voila.

    Pour le cas où cela pourrait servir à quelqu'un, enfin... Si ce n'est pas trop mal écrit bien sûr .

    Bahan

  2. #2
    Membre du Club Avatar de Raiden
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    Points : 65
    Points
    65
    Par défaut
    Tu pourrais peut-etre proposer ta fonction dans les codes sources C plutot que de la laisser ici Elle serait surement plus profitable la-bas

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Tu devrais éviter sprintf() et utiliser snprintf() à la place (tu as déjà entendu parler de "débordement de tampon" ?).

    Concernant le grep, il y a au moins une chose qui me gêne...
    Si un programme qui tourne s'appelle "loosh" et que tu appelles ta fonction avec "lo.sh" comme nom de script, tu vas aussi compter le programme "loosh" (qui n'est pas forcément louche, d'ailleurs) car le caractère "." a une signification particulière dans une regex.
    Moralité : il te faut échapper les caractères qui ont une signification particulière dans une regex.

    Appeler des commandes externes pour tester la correspondance d'une chaîne avec une regex et pour compter des lignes me paraît un peu "lourd" (trop grand nombre de processus lancés en même temps pour si peu de choses à mon goût).

    C'étaient mes 2 centimes...

  4. #4
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Je ne crois pas que ça fonctionne sur mon windows ! :'(

    ps -a | grep %s | wc -l

  5. #5
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Je ne crois pas que ça fonctionne sur mon windows ! :'(
    Ah oui, j'ai oublié de préciser que ça marchait sous un système Unix.

    Tu devrais éviter sprintf() et utiliser snprintf() à la place (tu as déjà entendu parler de "débordement de tampon" ?).
    Hum, je ne connaissais pas cette fonction. vais aller me renseigner. (parfois l'étendue de mon ignorance m'affole ).

    Et tu as sacrément raison concernant le grep. Je n'avais pas songé à ce genre de problème. Merci de m'avoir renseigné.

    Bahan, bon ben y a encore du boulot

    PS :
    Tu pourrais peut-etre proposer ta fonction dans les codes sources C plutot que de la laisser ici Elle serait surement plus profitable la-bas
    Me doutais bien que ma fonction présenterait quelques problèmes, du coup, je me suis dit, on va commencer par le forum.

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Pour développer, tu fais un sprintf en enregistrant dans la variable : char szBufferCommande[50];. Mais la fonction sprintf ne fait pas attention à la limitation des 50 ocets, c'est à dire que si ta ligne est plus importante (par exemple 200 octets), et bien, il va y avoir des données écrasé. En l'occurence, cela peut être : char szBuffer ou bien int j (cela dépend de comment le compilateur met les données).

    Avec snprintf, c'est toi qui choisi le nombre de caractère entrée (donc 50 au maximum), ce qui évite des écrasements (mais le programme peut se retrouver à ne pas marcher !!)

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 580
    Points
    41 580
    Par défaut
    De plus, le snprintf() qu'on trouve sur la plupart des systèmes unixoïdes correspond à celui du "nouveau" standard C99 :
    • retourne toujours la taille de la chaîne finale (sans le \0), quelle que soit celle du buffer (donc, >= buffer ---> tronqué)
    • Accepte un buffer NULL (justement pour retourner la taille)

  8. #8
    Membre régulier Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    Points : 88
    Points
    88
    Par défaut
    Ah d'accord, donc en mettant quelque chose de ce genre (en ayant défini un entier iTaille plus haut) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    iTaille = snprintf(szBufferCommande, 50, "ps -a | grep %s | wc -l",
     szNomScript);
    J'empêche le débordement, mais le risque d'erreur reste si le nom de mon script est trop long. Enfin, c'est toujours mieux qu'un écrasement .

    Merci aussi pour les précisions Médinoc.

    Bahan

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 580
    Points
    41 580
    Par défaut
    Sauf qu'avec le retour de snprintf(), tu peux faire un malloc() qui va bien...

    (enfin, si tu n'as pas de snprintf() standard C99 sur ta plate-forme (notamment sur les deux points que j'ai précisés), ici tu peux toujours faire un malloc() avec la bonne taille, puisque tu connais la chaîne. C'est quand il y a des trucs plus compliqués, notamment des nombres, qu'il faut faire bien gaffe à connaitre la taille maximale d'un nombre en chaîne...)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/09/2008, 11h46
  2. Fonction périodique d'exécution d'un script
    Par lodan dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2008, 08h26
  3. Fonction controle de saisie
    Par Nemesis007 dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 11/04/2008, 10h51
  4. Réponses: 3
    Dernier message: 10/08/2007, 13h04
  5. [Mail] la fonction mail-temps limite d'un script
    Par fk04 dans le forum Langage
    Réponses: 5
    Dernier message: 01/09/2006, 13h45

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