Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    115

    [_C_] Too many open files

    Salve ragazzi,
    ho programmato sotto LINUX un semplce programma che agisce sulle directory: in particolare tale programma riceve un nome di directory in input e per ogni file regolare di questa stampa la stringa di accesso con il comando ls -l.
    Il problema è che nell'aprire la directory, la shell mi risponde con
    Errore nell'apertura della directory . : too many open files.
    Mi aiutate.

    codice:
    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <unistd.h>
    #include <sys/wait.h>
    #include <fcntl.h>
    #include <dirent.h>
    #include <string.h>
    
    int lettura_dir(char *nome)
    {
     struct stat buf;
     int *info;
     struct dirent *d;
     DIR *dp;
     pid_t pid;
    
     if( (dp=opendir(nome))==NULL)
         {
          perror("Dir");
          printf("Errore nell'apertura della directory %s\n\n",nome);
          exit(-1);
         }
    
     while (d=readdir(dp))
        {
         if(d->d_ino!=0)
    	    {
    	     if(!(stat(d->d_name,&buf)))
    		    {
    		     if(S_ISDIR(buf.st_mode))
    			   {
    			    if(lettura_dir(d->d_name)==-1)
    				    return -1;
    			   }
    		     else
    			 {
    		          if(S_ISREG(buf.st_mode))
    				{
    				 pid=fork();
    				 switch (pid)
    				   {
    				    case -1 : printf("Errore di forking\n\n");
    					      exit(-1);
    				    case  0 : wait(info);
    					      if(!WIFEXITED(info))
    					         {
    					          printf("Errore nella lettura di uno dei file dell'albero di directory\n\n");
    						  exit(-1);
    						 }
    				    default : execl("ls","ls -l",d->d_name,NULL);
    				   }
    				}
    			 }
    		    }
    	     else
    		    {
    		     printf("Errore di stat\n\n");
    		     exit(-1);
    		    }
    	    }
        }
     return 0;
    }
    
    int main (int argc, char *argv[])
    {
     char *nome;
     if(argc!=2)
      {
       printf("USO CORRETTO: dir nome_di_una_directory\n\n");
       exit(-1);
      }
     nome=(char *)calloc(20,sizeof(char));
     nome=strcpy(nome,argv[1]);
     return lettura_dir(argv[1]);
    }

  2. #2
    too many open files
    potrei sbagliarmi:
    ma sembra che il programma stia cercando di "aprire/eseguire"
    un programma/comando già in esecuzione.
    ...Terrible warlords, good warlords, and an english song

  3. #3
    Utente di HTML.it L'avatar di /dev/null
    Registrato dal
    May 2004
    Messaggi
    1,936
    Allora...
    Nel ciclo della funzione lettura_dir() usi la ricorsione: quando trovi una sottodirectory richiami lettura_dir() per essa...
    Il problema e' che il primo file che trovi in una directory e' ".." ed il secondo e' "."...
    In questo modo quando il programma parte, legge la dir specificata dall'utente, ne legge i files e come primo file ottiene ".."...
    Quando arrivi in questo punto del ciclo
    codice:
    if(S_ISDIR(buf.st_mode)) {
        if(lettura_dir(d->d_name)==-1)
        return -1;
    }
    stai esaminando il file ".."...
    La macro IS_DIR ritorna TRUE, dato che ".." e' una directory e ti ritrovi a visualizzare il contenuto di ".."...

    Questo si ripete all'infinito finche' non raggiungi il limite massimo di files che un processo puo' avere contemporaneamente aperti ed il programma quindi riceve un errore dal kernel...

    Un modo possibile per risolvere e' questo:
    codice:
    if(S_ISDIR(buf.st_mode) && strcmp(d->d_name, "..") && strcmp(d->d_name, ".")) {
        if(lettura_dir(d->d_name)==-1)
        return -1;
    }



    Ho provato ad eseguire il programma correggendo quel pezzo, ma ho visto che ci sono altri problemi...
    Se non ti riesce risolverli riposta!

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

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    115
    Ti ringrazio comunque per il valido aiuto, proverò a risolvere i problemi di cui parli, grazie!!

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.