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]);
}