2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
1

Поиск исполняемых файлов

03.04.2011, 17:27. Показов 6843. Ответов 41
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У меня такая задача: найти в заданном каталоге и всех его подкаталогах все исполняемые файлы. Диапазон (мин. мах.) размеров файлов - первый и второй аргумент командной строки. Имя каталога - третий аргумент. Процедура поиска для каждого подкаталога должна запускаться в отдельном потоке.Число запущенных потоков в любой момент времени не должно превышать N (вводится пользователем).

Я вроде разобрался с тем, как 3-ий аргумент сделать именем каталога.
Первое, что непонятно, это: исполняемые файлы и их диапазон. Как можно их выявить и задать диапазон?

C++
1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char* argv[])
{
    DIR* dir;
    struct dirent* de;
 
    dir = opendir(argv[3]);
 
    while((de = readdir(dir)) != 0)
        ....  // тут ,думаю, и далжно проверить файлы на исполняемость?
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.04.2011, 17:27
Ответы с готовыми решениями:

Подсчет исполняемых файлов
Здарвствуйте. Нужно подсчитать количество исполняемых файлов в текущей папке. Методом гугления смог...

Компилятор Си для бинарных исполняемых файлов
Доброго времени! многие перехваливают этот язык из-за "простоты" и "переносимости" (по сравнению с...

Запуск исполняемых файлов
Всем привет! У меня есть вот такая вот штука application/x-executable. Как я понимаю это...

Исследование исполняемых файлов
Пишу программу для анализа исполняемых файлов но возникла проблема. Как узнать файловое смещение...

41
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
03.04.2011, 18:32 2
выполнить stat(argv[3] + '/' +de->d_name, &st) и проверить что st->st_size попадает в нужный интервал.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
03.04.2011, 19:10  [ТС] 3
А не могли бы Вы сказать, что за "st" ??? (Оно вроде нигде не обьявлено)
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
03.04.2011, 19:15 4
struct stat st;
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
03.04.2011, 19:39  [ТС] 5
struct stat st;
А тут точно нужен st ,а не *st?

Как я понимаю: начинаю читать катлог с помощью readdir() и должен каждый последующий файл проверять с помощью stat() ?
C++
1
2
while((de = readdir(dir)) != 0)
stat(argv[3] + '/' +de->d_name, &st);
У меня такая ошибка: invalid operands to binary + (have ‘char *’ and ‘char *’).
0
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
03.04.2011, 19:56 6
C++
1
2
3
4
5
char str[255];
while((de = readdir(dir)) != 0){
    sprintf(str,"%s/%s",argv[3], de->d_name);
    stat(str, &st);
}
Вроде так...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
03.04.2011, 19:58 7
А тут точно нужен st ,а не *st?
Простите, но если вы не понимаете в чем разница между foo и *foo, то вам нужно учить язык.

stat(argv[3] + '/' +de->d_name, &st);
*Сдавленным голосом из под стола* Вы так и написали?
Это псевдо код. Ваша задача склеить путь к каталогу отрытому opendir с символом / и именем файла в одну строку...
Извините еще раз, вам наверное в другой раздел форума, где какаю нибудь добрая душа сделает все за вас.

Добавлено через 1 минуту
Цитата Сообщение от gGrn-7DA Посмотреть сообщение
C++
1
2
3
4
5
while((de = readdir(dir)) != 0){
    char str[255];
    sprintf(str,"%s/%s",argv[3], de->d_name);
    stat(str, &st);
}
Вроде так...
Не катит) d_name еще влезет в str[255], а вот остальное нет(
0
мну довольно <(-__-)l
217 / 206 / 15
Регистрация: 17.01.2010
Сообщений: 2,462
03.04.2011, 20:27 8
C++
1
char *str=new char[1024];
а такая запись корректна будет???

Добавлено через 1 минуту
или точнее какую длину задать то?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
04.04.2011, 16:16 9
PATH_MAX из limits.h, само собой с проверкой что оно туда влезет, но в контексте того, что автору придется туда прикручивать триды лучше будет malloc() для Си или отдельный класс для плюсов, а может и не лучше...

Добавлено через 19 часов 39 минут
ТС, как ваши дела? Делитесь успехами)
Я почти весь обед потратил, почти 400строк и синхронизацию ниток не успел сделать.
1
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
13.04.2011, 22:35  [ТС] 10
Все выполняется и во все подкаталоги входит, но в конце еще вылазит "ошибка сигментирования". Что не так?

C++
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
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;
}
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 09:34 11
zhenya.ya, вашему творению хватит $(perl -e "print '0' x 1000") в качестве параметра чтоб упасть...
Мест где код может падать просто куча.
А что будет если ввести N <= 0?
Вся работа с нитями построена из каких-то нелепых предположениях.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 17:40  [ТС] 12
Предположим, я ввожу только работоспособные данные, без намерения сорвать код: ./1 0 3100 /usr /home/stud/file.txt
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 19:06 13
Хорошо, давайте предположим, что так и надо писать, в конце концов это не вы, а K&R виноваты...
Начнем c main() - код с 62ой по 88ю строки можно смело выкинуть - в таком виде смысла в них нет.
89 пишем &threads[0]
90 &threads[0], NULL /* не понимаю как оно вообще собирается в таком виде... */
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 20:00  [ТС] 14
Выкинул.
Добавил:
C++
1
2
pthread_create(&threads[0],NULL,func_thread,(void*)argv[3]);
        pthread_join(&threads[0],NULL);
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 20:25 15
И что получилось то в итоге, каков результат?
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 20:52  [ТС] 16
Снова в конце работы "Ошибка сегментирования"
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 21:04 17
может тогда все-таки проверить, что путь и имя лезут в path?
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 21:08  [ТС] 18
А можно ли, вместо char path[255] написать char *path=malloc(1011*sizeof(char)) ?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 21:10 19
Можно, конечно, но кроме того что 1011 больше чем 255 разницы не будет.
Вставьте вы проверку перед копированием и все
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 21:33  [ТС] 20
Это можно сделать как-то так:
if(strlen((char*)param)>1011 || strlen(d->d_name)>1011) printf(" overload\n");
else
{
0
14.04.2011, 21:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.04.2011, 21:33
Помогаю со студенческими работами здесь

Каталоги исполняемых файлов
При подключении каталога исполняемых файлов в VS2010, построение даже пустых проектов говорит: ...

Копирование исполняемых файлов
Скопировать все имеющиеся в каталоге Windows исполняемые файлы в каталог WinEx. Как выбрать именно...

Чтение бинарных исполняемых файлов
Пишу программу для загрузки Linux-приложений. Для этого собираюсь отлавливать все вызовы...

Проблема с загрузкой исполняемых файлов
При попытке загрузить файл с расширением .ехе или даже если просто набрать ехе в поисковике и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru