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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Bahan
    Inscrit en
    Avril 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    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 éclairé Avatar de Raiden
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 55
    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 émérite

    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
    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
    Par défaut
    Je ne crois pas que ça fonctionne sur mon windows ! :'(

    ps -a | grep %s | wc -l

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 147
    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
    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 !!)

+ 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