Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под *nix > C++ на Unix
Перезагрузить страницу Поиск исполняемых файлов
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
zhenya.ya zhenya.ya вне форума
Новичок
 
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 13.04.2011
Post Поиск исполняемых файлов - 13.04.2011, 23:59

У меня такое задание: написать программу, находящую в заданном каталоге и всех его подкаталогах все исполняемые файлы. Диапазон (мин. мах.) размеров файлов задаётся пользователем в качестве первого и второго аргумента командной строки. Имя каталога задаётся пользователем в качестве третьего аргумента командной строки. Программа выводит результаты поиска в файл (четвертый аргумент командной строки) в виде полный путь, имя файла, его размер. На консоль выводится общее число просмотренных файлов. Процедура поиска для каждого подкаталога должна запускаться в отдельном процессе. Каждый процесс выводит на экран свой pid, полный путь, имя и размер просмотренного файла, общее число просмотренных файлов в подкаталоге. Число запущенных процессов в любой момент времени не должно превышать N (вводится пользователем). Проверить работу программы для каталога /usr/ размер 31000 31500 N=6..

Вроде все ищет и во все подкаталоги залазит, но в конце, после вывода рузультата, появляется сообщение "ошибка сигментирования". Что не так?

cpp Код:
char s1[255];
char s2[255];
char s4[255];
int z=0;
 
void *func_thread(void *param)
{
DIR *dp,*pdp;
struct dirent *d;
struct stat file;
int x=0;
dp=opendir((char*)param);
while(d=readdir(dp))
{
char path[255];
strcpy(path,(char*)param);
strcat(path,"/");
strcat(path,d->d_name);
stat(path,&file);
pdp=opendir(path);
if(pdp!=0) { if((strcmp(d->d_name,"..")!=0) && (strcmp(d->d_name,".")!=0)) func_thread(path);}
 
if((!pdp)&&(file.st_size>atoi(s1))&&(file.st_size<atoi(s2))&&(((file.st_mode&S_IXUSR)!=0)))
{
printf("%u %s %s %d\n",pthread_self(),(char*)param,d->d_name, (int)file.st_size);
FILE *fp;
fp=fopen(s4,"a");
fprintf(fp,"%s %s %d ",(char*)param,d->d_name,(int)file.st_size);
if((file.st_mode & S_IRUSR)!=0) fprintf(fp,"r"); else fprintf(fp,"-");
if((file.st_mode & S_IWUSR)!=0) fprintf(fp,"w"); else fprintf(fp,"-");
if((file.st_mode & S_IXUSR)!=0) fprintf(fp,"x"); else fprintf(fp,"-");
 
if((file.st_mode & S_IRGRP)!=0) fprintf(fp,"r"); else fprintf(fp,"-");
if((file.st_mode & S_IWGRP)!=0) fprintf(fp,"w"); else fprintf(fp,"-");
if((file.st_mode & S_IXGRP)!=0) fprintf(fp,"x"); else fprintf(fp,"-");
 
if((file.st_mode & S_IROTH)!=0) fprintf(fp,"r"); else fprintf(fp,"-");
if((file.st_mode & S_IWOTH)!=0) fprintf(fp,"w"); else fprintf(fp,"-");
if((file.st_mode & S_IXOTH)!=0) fprintf(fp,"x"); else fprintf(fp,"-");
fprintf(fp,"\n");
fclose(fp);
x++;
}
}
z--;
}
 
 
 
 
int main(int argc, char **argv) {
   FILE *fp;
   fp=fopen(argv[4],"w");
   fclose(fp);
   strcpy(s1,argv[1]);
   strcpy(s2,argv[2]);
   strcpy(s4,argv[4]);
   int N;
   pthread_t threads[255];
   printf("ENTER MAX THREADS: ");
   scanf("%d",&N);
   char files[255][255];
   int count=0;
   DIR *dp,*pdp;
   struct dirent *d;
   struct stat file;
   dp=opendir(argv[3]);
   while(d=readdir(dp)) {
       char path[255];
       strcpy(path,argv[3]);
       strcat(path,"/");
       strcat(path,d->d_name);
       pdp=opendir(path);
       if((pdp) && (strcmp(d->d_name,"..")==1)) {
           strcpy(files[count],path);
           count++;
       }
   }
   int i;
   for(i=0;i<N;i++) {
       pthread_create(&threads[i],NULL,func_thread,(void*)files[i]);
       z++;
   }
   for(i=N;i<count;i++) {
       while(z==N) {}
       pthread_create(&threads[i],NULL,func_thread,(void*)files[i]);
       z++;
   }
   pthread_create(&threads[i+1],NULL,func_thread,(void*)argv[3]);
   pthread_join(threads[i+1]);
 
   return 0;
}
Ответить с цитированием
  (#2 (permalink)) Старый
__v1tos __v1tos вне форума
Новичок
 
Сообщений: 5
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 24.07.2011
По умолчанию 27.07.2011, 16:37

Цитата:
Сообщение от zhenya.ya Посмотреть сообщение
Процедура поиска для каждого подкаталога должна запускаться в отдельном процессе. Каждый процесс выводит на экран свой pid, полный путь, имя и размер просмотренного файла, общее число просмотренных файлов в подкаталоге. Число запущенных процессов в любой момент времени не должно превышать N (вводится пользовател
Это нужно было делать через fork(), а не через потоки
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файлов на трекерах tatyana-L Любые вопросы от новичков 6 23.07.2011 23:53
Поиск файлов в потоках eu6pc С/С++ 13 14.04.2011 14:43
поиск текстовых файлов bolonka Pascal 1 05.11.2009 06:26
Самоудаление исполняемых файлов Udovolstviye Вопросы начинающих программистов 0 20.07.2007 12:34
Поиск файлов по всем директориям Wormario WinAPI 1 06.04.2007 16:52
Поиск файлов по содержимому ic75 C++ Builder 7 26.10.2006 10:51
Самоудаление исполняемых файлов c++ WinAPI 13 21.10.2006 14:35
Выйти из функции поиск файлов Paha Visual C++ 11 21.08.2006 21:58
Быстрый поиск файлов Dian Зацените! 39 17.05.2006 14:56
Find поиск файлов в дериктории Sirko Delphi 19 24.08.2005 13:03
Поиск файлов с системе Кошмар Юмор 4 31.05.2005 07:13
Самоудаление исполняемых файлов Ex Система 0 07.06.2004 13:00



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов