Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119

    [C] Segmentation Fault...

    Ciao, per chi avesse voglia di dare un'occhiata q questi 3 brevi file... sapreste dirmi perche' una chiamata alla funzione fileList_1 spesso genera un segmentation fault nel bel mezzo dell'invio dei file sulla pipe ?!
    Errori nelle malloc o cosa ??

    Grazie.

    Link:

    http://xoomer.virgilio.it/ste.iarda/fileList_1.c
    http://xoomer.virgilio.it/ste.iarda/checkTxt.c
    http://xoomer.virgilio.it/ste.iarda/atomicWrite.c

  2. #2
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Esattamente che funzione ti va il segmentation?
    La fileList_1 a prima vista mi sembra corretta...
    Non e' che e' la sendFiles ad avere questo problema? Ed esattamente che riga ti da il problema?

    E poi hai detto "spesso"... Quindi non sempre...
    Quand'e' che va a buon fine e quando fa casino? Se non sai il motivo preciso fammi degli esempi: posta un `ls` delle dir che ti danno errore e di quelle che vanno a buon fine



    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  3. #3
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da /dev/null
    Esattamente che funzione ti va il segmentation?
    La fileList_1 a prima vista mi sembra corretta...
    Non e' che e' la sendFiles ad avere questo problema? Ed esattamente che riga ti da il problema?

    E poi hai detto "spesso"... Quindi non sempre...
    Quand'e' che va a buon fine e quando fa casino? Se non sai il motivo preciso fammi degli esempi: posta un `ls` delle dir che ti danno errore e di quelle che vanno a buon fine



    E' certamente la sendFiles a creare problemi (Io ho detto la fileList_1 perche' e' quella che chiamo dall'esterno). Piu' che spesso avrei fatto bene a dire quasi sempre. Solo in un caso e' andata a buon fine.

  4. #4
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    E in quel caso cosa c'era nella directory che hai scelto?


    A parte questo: la sendfiles e' molto lunga...
    Mi dici la linea esatta dove crasha?
    Per scoprire che istruzione e' o metti dei commenti ogni poche linee oppure usa il GDB...


    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  5. #5
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Allora, non ho ancora capito su quale tipo di file/dir viene generato l'errore.
    Comunque ho messo tutto in unico file, tralasciando l'uso delle pipe ma stampando soltanto a video i file trovati. Il file e' compilabile digitando soltanto "gcc -o fileL fileL.c" ed eseguibile con "fileL nomeDir".
    Ancora segmentation fault in alcune directory.
    L'errore, credo, si verifichi trattando "particolari" tipi di file (Ma non so quali).
    Mi aiutate ?



    Eccolo qua:

    codice:
    #include <dirent.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>  /* serve per la perror */
    #include <string.h> /* serve per strlen    */
    #include <errno.h>  /* serve per errno     */
    #include <stdlib.h>
    #include <dirent.h>
    #include <unistd.h>
    
    #define IFERROR(s,m) if((s)==-1) {perror(m); exit(errno);}
    #define IFERROR3(s,m,c) if((s)==-1) {perror(m); c;}
    
    #define WRITE(m) IFERROR(write(STDOUT,m,strlen(m)), m);
    #define WRITELN(m) WRITE(m);WRITE("\n");
    
    #define STDIN  0
    #define STDOUT 1
    #define STDERR 2
    
    #define FALSE 0
    #define TRUE 1
    
    #define SUCCESS -5
    #define ERROR -10
    #define FAILURE -15
    
    static int sendFiles(DIR *, int);
    static int fileL_1(char*);
    static int checkTxt(char*);
    
    int main(int argc, char*argv[])
    {
       if (argc < 2)
       {
         printf("Usage: fileL dirName");
         exit(-1);
       }
    
       int returnValue;
       if ((returnValue=fileL_1(argv[1])) == SUCCESS)
        	printf("fileList_1: SUCCESS\n");
       else
       	printf("fileList_1: ERROR\n");
    
       return(0);
    }
    
    int checkTxt(char* fileName)
    {
      if (fileName == NULL)
        return FALSE;
    
      int length = strlen(fileName);/*Lunghezza del nome del file*/
      char*ext = fileName + (length - 4);/*Puntatore agli ultimi 4 caratteri */
    
      if (strcmp(ext,".txt") == 0)
        return TRUE;/*Per "terminare" la ricorsione*/
      else return FALSE;
    
    }
    
    int fileL_1 (char * dirName)
    {
      DIR * dir;
    
      /*Apro la directory*/
      if ((dir = opendir(dirName)) == NULL)
        return FAILURE;
    
      int returnValue;
      if (chdir(dirName)== -1)
        {
          perror("Error on chdir");
          exit(errno);
        }
    
      returnValue = sendFiles(dir, SUCCESS);
    
      if (returnValue == FAILURE)
        {WRITELN("fileList_1: error searching the files");}
    
      else/*Mando il messaggio di fine operazione*/
        {WRITELN("fileList_1: operation terminated");}
    
      if (closedir(dir) == -1)/*Chiusura directory*/
        perror("fileList_1: error closeing directory");
    
      return returnValue;/*Per far capire alla call1 se l'operazione e' andata a buon fine oppure no*/
    }
    
    
    
    static int sendFiles(DIR * dir, int result)
    {
      /*Effects:
        invia ricorsivamente sulla pipe fd
        tutti i file contenuti nella directory;    dir e nelle sue sottodirectory
      */
    
      int res = result;
      /*Finche' err vale SUCCESS non ci sono stati errori
        Quando error varra' FAILURE le chiamate ricorsive termineranno*/
    
      struct dirent * infoDirent;
      struct stat infoStat;
    
      char * superdir = getcwd(NULL, 0);//?
    
      while(((infoDirent = readdir(dir)) != NULL) && (res == SUCCESS))
        {
          if ((lstat(infoDirent->d_name, &infoStat)) == -1)
    	/*Non voglio avere problemi con i link simbolici*/
    	{
    	  res = FAILURE;
    	  
    	  return res;
    	}
          
          if (S_ISDIR(infoStat.st_mode))
    	{/*Se e' una directory ed e' permesso a chiunque l'accesso in lettura */
    	  if(strcmp(infoDirent->d_name, "..") && strcmp(infoDirent->d_name, ".") && ((infoStat.st_mode & (S_IROTH|S_IXOTH|S_IRGRP|S_IXGRP|S_IRUSR|S_IXUSR)) == (S_IROTH|S_IXOTH|S_IRGRP|S_IXGRP|S_IRUSR|S_IXUSR)))
    	    {/*...e non e' ne' "." ne' ".."*/
    	      DIR * sottodir;
    	      if ((sottodir = opendir(infoDirent->d_name)) == NULL)
    		 {
    		   res = FAILURE;
    		   return res;
    		 }
    	      /*La rendo directory corrente*/
    	       
    	       if (chdir(infoDirent->d_name) == -1)
    		 {
    		   res = FAILURE;
    		   return res;
    		 }
    	       
    	       /*Applico ricorsivamente la funzione*/
    	       res = sendFiles(sottodir, res);
    	       
    	       if (closedir(sottodir) == -1)
    		 perror("fileList_1: error on closedir");
    	       
    	       /*Al termine della chiamata ricorsiva chiudo la directory
    		 e torno in quella DA CUI ERO VENUTO (Solitamente quella padre...
    		ma non necessariamente...) per poter fare correttamente le rimanenti stat*/
    
    	       if (chdir(superdir) == -1)
    		 {
    		   res = FAILURE;
    		   return res;
    		 }
    	     }
    	}
          /*E' un file: lo devo inviare !*/
    
          else
    	{
    	  if (S_ISREG(infoStat.st_mode) && ((infoStat.st_mode & (S_IROTH|S_IRGRP|S_IRUSR)) == (S_IROTH|S_IRGRP|S_IRUSR)))
    	    /*Considero solo i file che chiunque puo' leggere*/
    	    {
    	      if (checkTxt(infoDirent->d_name) == TRUE)
    		{
    		  
    		  char * pathName;
    		  pathName = getcwd(NULL, 0);
    		  char * completeName = (char*) malloc(strlen(pathName) + 1 + strlen(infoDirent->d_name));
    		  sprintf(completeName,"%s/%s",pathName, infoDirent->d_name);
    		  //printf("DataServer: invio %s lungo %d caratteri\n", completeName, strlen(completeName));
    		  printf("File:   %s\n", completeName);
    		  free(pathName);
    		  free(completeName);
    		}
    	    }
    	}
        }
      return res;
    }

  6. #6
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    L'ho provato su quattro directoryes (".", "..", "~" e "~/tmp") e non ho avuto nessunissimo problema


    $ ./fileL .
    fileList_1: operation terminated
    fileList_1: SUCCESS

    $ ./fileL ..
    fileList_1: operation terminated
    fileList_1: SUCCESS

    $ ./fileL ~
    fileList_1: operation terminated
    fileList_1: SUCCESS

    $ ./fileL ~/tmp/
    fileList_1: operation terminated
    fileList_1: SUCCESS
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  7. #7
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da /dev/null
    L'ho provato su quattro directoryes (".", "..", "~" e "~/tmp") e non ho avuto nessunissimo problema


    $ ./fileL .
    fileList_1: operation terminated
    fileList_1: SUCCESS

    $ ./fileL ..
    fileList_1: operation terminated
    fileList_1: SUCCESS

    $ ./fileL ~
    fileList_1: operation terminated
    fileList_1: SUCCESS

    $ ./fileL ~/tmp/
    fileList_1: operation terminated
    fileList_1: SUCCESS
    Prova a dargli il via su / o su /usr ...
    Vedrai che da SIGSEV

  8. #8
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Originariamente inviato da Ed_Bunker
    Prova a dargli il via su / o su /usr ...
    Vedrai che da SIGSEV
    Non ho provato li' perche' in quelle dirs ho miliardi e miliardi di sottodir e files e quindi ci sta delle ore
    Ora provo e ti posto il risultato appena ha fatto


    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

  9. #9
    Utente di HTML.it L'avatar di Ed_Bunker
    Registrato dal
    Jul 2003
    Messaggi
    1,119
    Originariamente inviato da /dev/null
    Non ho provato li' perche' in quelle dirs ho miliardi e miliardi di sottodir e files e quindi ci sta delle ore
    Ora provo e ti posto il risultato appena ha fatto


    Ok, grazie.
    Magari, se ne hai veramente troppi, prova in qualche directory un po' piu' piccola... /var ad esempio...



  10. #10
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    $ ./fileL /usr/
    File: /usr/kde/3.2/share/doc/HTML/en/kppp/ttyS-cua.txt
    File: /usr/kde/3.2/share/doc/HTML/en/kcalc/kcalc_on_Aix.txt
    File: /usr/kde/3.2/share/doc/HTML/en/kcalc/kcalc_on_OSF.txt
    File: /usr/kde/3.2/share/apps/khangman/data/ca/animals.txt
    Segmentation fault





    Ora leggo un po' i sorci
    Ultima modifica ad opera dell'utente /dev/null il 01-01-0001 alle 00:00

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.