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 :

Inotify "loupe" des fichiers


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 210
    Points : 91
    Points
    91
    Par défaut Inotify "loupe" des fichiers
    Bonjour,

    Petit soucis du jour: J'ai un petit programme qui surveille un dossier. A chaque fois qu'une fichier est créé dans le dossier, j'effectue une opération puis je supprime le fichier. Au bout de X temps, j'ai une requête à la base de donnée.
    Mon problème est que pendant l'accès la base de donnée, Inotify loupe des fichiers qui sont créer dans le dossier. Pour être certain que le problème venait de ma requête à la Base de donnée, j'ai testé en remplaçant tout la partie Mysql par un bête
    . Avec le sleep, inotify loupe également les fichiers.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/inotify.h>
    #include <time.h> 
    //mysql
    #include <mariadb/mysql.h>
     
    int main()
    {
     
      char chemin[100] = "/tmp/";
     int i=0;
      int fd = inotify_init();
      if (fd < 0)
            perror("inotify_init() \n");
     int wd = inotify_add_watch(fd, "/tmp/seb/une/", IN_CLOSE_WRITE);
      if (wd < 0)
            perror("inotify_add_watch \n");
        FILE* fichier = NULL;
     
        while (1)
        {
    		char chemin_et_fichier[300] ="";
    		char nom_fichier[200]="";
    		char tampon[200];
     
            if(read(fd, tampon, 200)==-1) {
              printf("erreur %s\n", strerror(errno));
            }
        ;
            strcpy(nom_fichier,((struct inotify_event*)tampon)->name);//copie du chemin dans la variable chemin
    		strcat(chemin_et_fichier, chemin);
    		strcat(chemin_et_fichier, nom_fichier);
    if(i==250)
    {
    //connexion mysql
    MYSQL *conn;
    MYSQL_RES *res;
    MYSQL_ROW row;
     
    char *server = "localhost";
    char *user = "***";
    char *password = "***"; 
    char *database = "BD";
     
    conn = mysql_init(NULL);
     
    if (!mysql_real_connect(conn, server,user, password, database, 0, NULL, 0)) {
          fprintf(stderr, "%s\n", mysql_error(conn));
          exit(1);
    }  
    char insertion[300];
    sprintf(insertion, "SELECT * FROM BD WHERE debut < %d ORDER BY debut DESC LIMIT 1", (int)time(NULL));
    if (mysql_query(conn, insertion)) {
    fprintf(stderr, "%s\n", mysql_error(conn));
    exit(1);
    }
    res = mysql_use_result(conn);
     
    while ((row = mysql_fetch_row(res)) != NULL)
    {
    printf("%s %s %s %s \n", row[0],row[1],row[2],row[3]);
    }
    mysql_free_result(res);
    mysql_close(conn);
    i=0;		
     
    }else{
    i=i+1;
    }
     
    remove(chemin_et_fichier);
    }
     
    return (0);
    }
    Outre un connexion non bloquante à la base de donnée, voyez vous une autre solution?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par sebaaas Voir le message
    Outre un connexion non bloquante à la base de donnée, voyez vous une autre solution?
    Un fork(). Dès que tu as reçu une notification, tu génères un fils qui s'occupe de la partie bdd tandis que le père retourne à l'écoute des évènements. Comme ça il n'est pas bloqué à faire autre chose pendant qu'un autre fichier arrive.
    Accessoirement tu peux remplacer ton strcpy() et tes strcat() par un simple sprintf() (surtout que la variable "nom_fichier" ne sert pas vraiment à grand chose). Sinon t'es pas trop copain avec les tabulations toi. T'aimes pas avoir un code bien structuré, agréable à relire et éventuellement à modifier ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 210
    Points : 91
    Points
    91
    Par défaut
    Fork marche du tonner :-)

    Je viens de tester ce petit code qui répond à mes attentes. Je testerai sur mon programme plus tard.
    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
    #include <stdio.h>
    #include <unistd.h>
     
    int main(void) 
    {
      int i=0;
      while(1)
      {
        if (i==10) 
        { 
        i=0;
        if(fork()==0)
          {   
          printf(" a \n");
          sleep (3);
          printf(" b \n");
          break;
          }
        } 
      printf("Hello World %d \n",i);
      sleep(1);
      i=i+1;  
      }
      return 0;
    }
    Merci

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sebaaas Voir le message
    Je testerai sur mon programme plus tard.
    Pour te faire plaisir, j'ai testé pour toi

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <sys/inotify.h>
    #include <time.h> 
    //mysql
    #include <mariadb/mysql.h>
     
    int main() {
     
    	char *chemin="/tmp/seb";
    	int i=0;
    	int fd = inotify_init();
    	if (fd < 0)
    		perror("inotify_init() \n");
    	int wd = inotify_add_watch(fd, chemin, IN_CLOSE_WRITE);
    	if (wd < 0)
    		perror("inotify_add_watch \n");
     
    	while (1) {
    		char tampon[200];
     
    		if(read(fd, tampon, 200)==-1) {
    				printf("erreur %s\n", strerror(errno));
    		}
    		switch (fork()) {
    			char path[300];
    			case -1: // Erreur
    				perror("Erreur fork\n");
    				break;
    			case 0: // Fils
    				sprintf(path, "%s/%s", chemin, ((struct inotify_event*)tampon)->name);
    				printf("[%s] (%d)\n", path, getpid());
    				sleep(10);
    				remove(path);
    				exit(0);
    			default: // Pere
    				;
    		}
    	}
     
    	return (0);
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. [WD12] activer la loupe sur des colonnes de table fichier
    Par karim15 dans le forum WinDev
    Réponses: 1
    Dernier message: 13/10/2012, 03h10
  2. quote dans fichier properties
    Par totoche dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 21/04/2010, 22h04
  3. Réponses: 3
    Dernier message: 25/07/2002, 10h42
  4. [langage] comment créer des fichiers ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2002, 16h33
  5. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 22h37

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