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
    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
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    sleep(1);
    . 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
    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 «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  3. #3
    Membre régulier
    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
    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 «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site