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

POSIX C Discussion :

problème pipe() et write()


Sujet :

POSIX C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Points : 24
    Points
    24
    Par défaut problème pipe() et write()
    Bonjour, je travail sur un programme qui affiche a l'ecran tout fichier trouver dans un repertoire pasé en parametre et écrit dans un tube tous les fichiers d'une extension donnée dans un tube passé en paramètre, mais pour une raison qui me dépasse le programme quitte sans erreur et sans raison dès l'appel de la fonction write().

    Je précise que le code compile sans erreur et quitte également sans erreur.

    Si une âme charitable pouvait me tirer cette épine du pied je lui en serait reconnaissant ^^.

    voici le code
    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <dirent.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/uio.h>
    #include <math.h>
     
    #define MAXCARS 256
     
    int FicExt(char *ref,char *ext){
    	int i,j;
    	i=0;
    	char extlue[strlen(ext)];
    	strcpy(extlue,"");
     
    	while(i<strlen(ref)){//tant que le curseur n'est pas a la fin du nom
    		for(j=0;j<strlen(ext);j++){
    			if(ref[i]=='\0' || ref[i]=='\n') printf("\0 ou \n detecte");
    			strncat(extlue,&ref[i],1);//on copie ds extlue taille de extension caractères après le '.' ex: 1 car extension = 'c'
    			i++;//on bouge le curseur
    		}
    		if(strcmp(extlue,ext)==0)
    			return 0;
    		else{
    			i++;
    			while(ref[i]!='.') i++;
    			strcpy(extlue,"");
    		}
    	}
    	return -1;
    }
     
    void parcoursRec(char *nomrep, char *extension, int *tube){
    	DIR *rep;
    	struct dirent *ent;
    	struct stat buf;
    	char ref[MAXCARS];
    	int nbE;
    	close(tube[0]);
    	rep=opendir(nomrep);
     
      	if(rep != NULL){
        	while(ent = readdir(rep)){
    	    	if(strcmp(ent->d_name,".") && strcmp(ent->d_name,"..")){
    				strcpy(ref,nomrep);
    				strcat(ref,"/");
    				strcat(ref,ent->d_name);
          			        if(lstat(ref,&buf) == 0) {
    		  			if(S_ISDIR(buf.st_mode))   
                                                   parcoursRec(ref,extension,tube);
    	          		        else{
    	          			        printf("%s\n",ref);
    	          			        if(FicExt(ref,extension)==0){
    	          				      nbE=write(tube[1],ref,sizeof(ref));
    	          				      if(nbE<0) perror("erreur ecriture");
    	          			        }
    	                                 }
    				}
    	   		}
    	} // fin while
        	closedir(rep);
        	close(tube[1]);
      	} // fin if(rep..)
    }
     
    int main (int argc,char **argv){
    	int tube[2];
    	if(pipe(tube) == -1){
          perror("pipe"); 
          exit(1);
         }
     
    	if(argc<4){
    		printf("erreur arguments : crypte nom_repertoire nom_extension(ex:'.cc') nbprocessus(entier)\n");
    		exit(1);
    	}
    	else if(strlen(argv[2])<2){
    		printf("erreur extension : exemple, '.c'\n");
    		exit(1);
    	}
    	else if(atoi(argv[3])<1){
    		printf("erreur nbprocessus : il faut au moins 1 processus\n");
    		exit(1);
    	}
     
    	parcoursRec(argv[1],argv[2],tube);
     
     
    }

    Voici le résultat avec le write activé dans la fonction récursive parcoursRec :

    macbook-de-izak-izak:projet izakizak$ gcc -o projetfinal projetfinal.c
    macbook-de-izak-izak:projet izakizak$ ./projetfinal . .c 1
    ./.DS_Store
    ./fic1.txt
    ./fic2.txt
    ./projet
    ./projet.c
    macbook-de-izak-izak:projet izakizak$

    au premier appel de write hop le programme fini.

    et voici le résultat quand la fonction write est desactivée :

    macbook-de-izak-izak:projet izakizak$ gcc -o projetfinal projetfinal.c
    macbook-de-izak-izak:projet izakizak$ ./projetfinal . .c 1
    ./.DS_Store
    ./fic1.txt
    ./fic2.txt
    ./projet
    ./projet.c
    ./projetfinal
    ./projetfinal.c
    macbook-de-izak-izak:projet izakizak$

    ici nickel le programme a bien affiché tout les fichiers qu'il a trouvé
    Comme vous le constatez au moindre appel de write, tout le programme est terminée sans aucun message d'erreur et surtout sans exécuter la suite du code. Je ne comprend pas du tout pourquoi se comportement.

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    main.c:14: attention : no previous prototype for ‘FicExt’
    main.c: In function ‘FicExt’:
    main.c:21: attention : comparaison entre élément signé et élément non signé
    main.c:23: attention : comparaison entre élément signé et élément non signé
    main.c:25: attention : embedded ‘\0’ in format
    main.c: Hors de toute fonction :
    main.c:41: attention : no previous prototype for ‘parcoursRec’
    main.c: In function ‘parcoursRec’:
    main.c:53: attention : parenthèses suggérées autour de l'affectation utilisée comme valeur de vérité
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Points : 24
    Points
    24
    Par défaut
    T'es erreurs sont étranges, personnellement je compile sans erreur avec GCC4
    il ne me réclame aucun prototype donc me faudrait peut être une explication la, on dirait qu'il aime pas mes ma comparaison aux caractères ton compilateur.

    Dans tout les cas j'ai réussi à résoudre mon problème moi même le problème venait du fait que les écritures sont bloquantes, si il n'y a pas de processus lecteur alors ça n'écrit pas pour l'écrivain ^^. Une vieille règle des tubes que j'avais oublié

    Bref problème résolu par mes soins

    Merci pour le temps perdu à essayer de m'aider.

  4. #4
    Membre régulier Avatar de krieg
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 75
    Points : 92
    Points
    92
    Par défaut
    Salut en effet je viens de regarder ton programme.
    La prochaine fois utilise gdb, tu sais ça marche super bien.

    bye

Discussions similaires

  1. Problème avec Response.write et <!DOCTYPE .. >
    Par Gunny dans le forum ASP.NET
    Réponses: 2
    Dernier message: 22/07/2008, 15h41
  2. problème avec ofstream::write
    Par b4u dans le forum SL & STL
    Réponses: 3
    Dernier message: 01/06/2006, 14h17
  3. Problème socket : le write ne se fait qu'au moment du close
    Par Synn dans le forum Développement
    Réponses: 6
    Dernier message: 23/05/2006, 15h16
  4. Problème avec document.write()
    Par d.w.d dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 19/01/2006, 12h06
  5. Problème de read/write
    Par mylooz dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 25/03/2005, 19h15

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