Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320

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

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

Студворк — интернет-сервис помощи студентам
У меня такая задача: найти в заданном каталоге и всех его подкаталогах все исполняемые файлы. Диапазон (мин. мах.) размеров файлов - первый и второй аргумент командной строки. Имя каталога - третий аргумент. Процедура поиска для каждого подкаталога должна запускаться в отдельном потоке.Число запущенных потоков в любой момент времени не должно превышать 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.04.2011, 17:27
Ответы с готовыми решениями:

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

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

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

41
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 21:41
Студворк — интернет-сервис помощи студентам
нет. вам нужно место для strlen(param) кстати нахрена вы его постоянно кастуете + '/' + strlen(d_name) + '\0'
так это и проверяйте.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 22:09  [ТС]
Проверяю, но все равно после вывода всех данных - ошибка сегментирования.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 22:11
Давайте что ли еще раз код посмотрим, полностью. Или подождите минут 30 допишу что начал неделю назад.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 22:25  [ТС]
Получился довольно маленький и удобный код:

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
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[1011];
if((strlen(param) +'/'+strlen(d->d_name) +'\0')<1011)
{
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);
//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);
        pthread_create(&threads[0],NULL,func_thread,(void*)argv[3]);
        pthread_join(&threads[0],NULL);
 
        return 0;
}
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 23:17
Извиняйте, с ходу не понимаю где именно оно падает, если актуально завтра еще посмотрю.

Гляньте, как у меня получилось.

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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/stat.h>
#include <dirent.h>
#include <err.h>
#include <errno.h>
#include <limits.h>
#include <pthread.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
 
#define THREADS_MAX     64
 
 
#define MAXINT(T)       ((T) (((T)1 << ((sizeof(T) * CHAR_BIT) - 1) ^ ((T) -1))))
#define OFF_T_MAX       MAXINT(off_t)
#ifndef LLONG_MAX
#define LLONG_MAX       MAXINT(long long)
#endif
#ifndef LLONG_MIN
#define LLONG_MIN       (-LLONG_MAX - 1LL)
#endif
 
#define INVALID         1
#define TOOSMALL        2
#define TOOLARGE        3
 
#ifdef DEBUG
#define MAX_LOGLINE     512
#define MAX_LOGLEVEL    4
#define logmsg(...)     __logmsg(__VA_ARGS__)
#else
#define logmsg(...)
#endif /* DEBUG */
 
extern char     *__progname;            /* From crt0.o */
pthread_mutex_t  pnmutex;               /* pathname queue synchronization */
off_t            size_max;              /* Mimimal file size */
off_t            size_min;              /* Maximal file size */
int              threads_max;           /* Threads upper limit */
int              threads_run;           /* Number of running threads */
pthread_mutex_t  tmutex;                /* threads queue synchronization */
 
/* Directory and stat() path storage */
struct pathname {
        SIMPLEQ_ENTRY(pathname)  entries;
        char                    *path;
};
SIMPLEQ_HEAD(, pathname) head;
 
/* Threads queue entry */
struct thread {
        SIMPLEQ_ENTRY(thread)   entries;
        pthread_t               tid;
};
 
#ifdef DEBUG
void             __logmsg(int, const char *, ...);
#endif /* DEBUG */
void             pathname_del(struct pathname *);
struct pathname *pathname_new(void);
struct pathname *pathname_pop(void);
void             pathname_push(struct pathname *);
void             pathname_set(struct pathname *, char *, char *);
void            *scan_do(void *);
struct thread   *scan_next(void);
long long        strtonum(const char *, long long, long long, const char **);
void             thread_lock(pthread_mutex_t *);
void             thread_unlock(pthread_mutex_t *);
void             usage(int);
 
#ifdef DEBUG
/* Output log message */
void
__logmsg(int loglevel, const char *format, ...)
{
        va_list         ap;
        char pad[MAX_LOGLEVEL * 2 + 1];
        char buf[MAX_LOGLINE];
 
        if (loglevel > MAX_LOGLEVEL)
                loglevel = MAX_LOGLEVEL;
        if (loglevel > 1) {
                memset(&pad, ' ', (loglevel - 1) * 2);
                pad[(loglevel - 1) * 2] = '\0';
        } else
                pad[0] = '\0';
 
        va_start(ap, format);
        /* We don't care about truncation. */
        snprintf(buf, sizeof(buf), format, ap);
        fprintf(stderr, "%s[%p]%s\n",
            pad, pthread_self(), buf);
        va_end(ap);
}
#endif /* DEBUG */
 
/*
 * Traverse a file hierarchy starting from given path,
 * search for executable files and check what file size
 * between given boundaries (if specified).
 * Each directory entry processing goes in separate thread.
 */
int
main(int argc, char *argv[]) {
        struct pathname *pn;
        int ch;
        const char *errstr;
 
        /* Defaults */
        size_max = -1;
        size_min = -1;
        threads_max = 2;
        threads_run = 0;
        SIMPLEQ_INIT(&head);
        pthread_mutex_init(&pnmutex, NULL);
        pthread_mutex_init(&tmutex, NULL);
 
        while ((ch = getopt(argc, argv, "hM:m:t:")) != -1)
                switch (ch) {
                case 'h':
                        usage(0);
                        /* NOTREACHED */
                case 'M':
                        size_max = strtonum(optarg, 0, OFF_T_MAX, &errstr);
                        if (errstr)
                                errx(1, "bad max file size \"%s\": %s",
                                        optarg, errstr);
                        break;
                case 'm':
                        size_min = strtonum(optarg, 0, OFF_T_MAX, &errstr);
                        if (errstr)
                                errx(1, "bad min file size \"%s\": %s",
                                        optarg, errstr);
                        break;
                case 't':
                        threads_max = strtonum(optarg, 1, THREADS_MAX, &errstr);
                        if (errstr)
                                errx(1, "bad threads limit \"%s\": %s",
                                        optarg, errstr);
                        break;
                default:
                        usage(1);
                        /* NOTREACHED */
                }
        argc -= optind;
        argv += optind;
        if (argc > 1)
                usage(1);
        if (size_max > -1 && size_min > size_max)
                errx(1, "min > max");
 
        logmsg(1, "%s()", __FUNCTION__);
        pn = pathname_new();
        if (argc)
                pathname_set(pn, argv[0], "");
        else
                pathname_set(pn, ".", "");
        pathname_push(pn);
 
        /* We don't use mutex here, because hope this is single thread */
        while (!SIMPLEQ_EMPTY(&head))
                scan_do(NULL);
 
        return (0);
}
 
/* Delete pathname structure */
void
pathname_del(struct pathname *pn)
{
        logmsg(2, "%s(%p)", __FUNCTION__, pn);
 
        if (pn->path) {
                logmsg(3, "freeing \"%s\" at %p", pn->path, pn->path);
                free(pn->path);
                pn->path = NULL;
        }
        free(pn);
}
 
/* Allocate new pathname structure */
struct pathname *
pathname_new(void) {
        struct pathname *pn;
 
        pn = malloc(sizeof(struct pathname));
        if (pn == NULL) {
                err(1, "malloc");
        }
        pn->path = NULL;
        logmsg(2, "%s(): %p", __FUNCTION__, pn);
 
        return (pn);
}
 
/* Fill path in pathname structure */
void
pathname_set(struct pathname *pn, char *dir, char *name)
{
        size_t  dlen, nlen;
        char *path;
 
        logmsg(2, "%s(%p, %s, %s)", __FUNCTION__, pn, dir, name);
        dlen = strlen(dir);
        if (dlen == 0)
                err(1, "empty path");
        nlen = strlen(name);
        path = malloc(dlen + nlen + 2);
        if (path == NULL)
                err(1, "malloc");
        strncpy(path, dir, dlen + 1);
        if (path[dlen - 1] != '/')
                strncat(path, "/", 1);
        if (nlen)
                strncat(path, name, nlen);
        pn->path = path;
        logmsg(3, "\"%s\" at %p %d byte(s)", pn->path, path, dlen + nlen + 2);
}
 
/* Push pathname structure into fifo queue */
void
pathname_push(struct pathname *pn)
{
        logmsg(2, "%s([%p]%s)", __FUNCTION__, &pn, pn->path);
 
        thread_lock(&pnmutex);
        SIMPLEQ_INSERT_TAIL(&head, pn, entries);
        thread_unlock(&pnmutex);
}
 
/* Pop pathname structure from fifo queue */
struct pathname *
pathname_pop(void)
{
        struct pathname *pn;
 
        logmsg(2, "%s()", __FUNCTION__);
        pn = NULL;
        thread_lock(&pnmutex);
        if (!SIMPLEQ_EMPTY(&head)) {
                pn = SIMPLEQ_FIRST(&head);
                SIMPLEQ_REMOVE_HEAD(&head, entries);
        }
        thread_unlock(&pnmutex);
        logmsg(3, "%p, %s", pn, pn ? pn->path : "empty queue");
 
        return (pn);
}
 
/* Scan directory. */
void *
scan_do(void * arg)
{
        SIMPLEQ_HEAD(, thread) thead = SIMPLEQ_HEAD_INITIALIZER(thead);
        struct dirent   *de;
        struct pathname *pn, *ne;
        struct stat      st;
        struct thread   *t;
        DIR             *dp;
        (void)           arg;           /* Unused */
 
        logmsg(1, "%s()", __FUNCTION__);
        ne = NULL;
 
        /* Shuld not happen, but... */
        if ((pn = pathname_pop()) == NULL) {
                thread_lock(&tmutex);
                if (threads_run)
                        threads_run--;
                thread_unlock(&tmutex);
                logmsg(2, "nothing to do");
                return (NULL);
        }
 
        logmsg(2, "scanning %s", pn->path);
 
        if ((dp = opendir(pn->path)) == NULL) {
                if (errno != EACCES)
                        err(1, "opendir");
                pathname_del(pn);
                thread_lock(&tmutex);
                if (threads_run)
                        threads_run--;
                thread_unlock(&tmutex);
                logmsg(1, "%s(): abort.", __FUNCTION__);
                return (NULL);
        }
 
        while ((de = readdir(dp)) != NULL) {
                /* man page says what de->d_type may be
                 * unimplemented for some fs, so don't
                 * we use it.
                 */
                logmsg(3, "%s", de->d_name);
                if (strcmp(de->d_name, ".") == 0 ||
                    strcmp(de->d_name, "..") == 0)
                        continue;
                if (ne == NULL)
                        ne = pathname_new();
 
                pathname_set(ne, pn->path, de->d_name);
 
                if (lstat(ne->path, &st) == -1) {
                        if (errno != EACCES && errno != ENOENT)
                                warn("lstat(\"%s\")", ne->path);
                        free(ne->path);
                        ne->path = NULL;
                        continue;
                }
 
                if (S_ISDIR(st.st_mode)) {
                        logmsg(4, "DIR");
                        pathname_push(ne);
                        if ((t = scan_next()))
                                SIMPLEQ_INSERT_TAIL(&thead, t, entries);
                        ne = NULL;
                        continue;
                }
 
                if (S_ISREG(st.st_mode) &&
                    st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) {
                        logmsg(4, "EXE");
                        /* Just for break */
                        do {
                                if (size_min > -1 && st.st_size < size_min)
                                        break;
                                if (size_max > -1 && st.st_size > size_max)
                                        break;
                                printf("%s\n", ne->path);
                        } while (0);
                }
 
                free(ne->path);
                ne->path = NULL;
        }
 
        closedir(dp);
        if (ne)
                pathname_del(ne);
        pathname_del(pn);
 
#if 0
        if ((t = scan_next()))
                SIMPLEQ_INSERT_TAIL(&thead, t, entries);
#endif
 
        while ((t = SIMPLEQ_FIRST(&thead)) != NULL) {
                SIMPLEQ_REMOVE_HEAD(&thead, entries);
                logmsg(2, "join(%p)", t->tid);
                pthread_join(t->tid, NULL);
                free(t);
        }
 
        thread_lock(&tmutex);
        if (threads_run)
                threads_run--;
        thread_unlock(&tmutex);
        logmsg(1, "%s(): done.", __FUNCTION__);
 
        return (NULL);
}
 
/* Run next scan thread */
struct thread *
scan_next(void)
{
        struct thread   *t;
 
        logmsg(2, "%s()", __FUNCTION__);
        t = NULL;
 
        thread_lock(&tmutex);
        if (threads_run < threads_max) {
                if ((t = malloc(sizeof(struct thread))) == NULL) {
                        warn("malloc");
                } else {
                        if (pthread_create(&t->tid, NULL, &scan_do, NULL)) {
                                warn("pthread_create");
                                free(t);
                                t = NULL;
                        } else
                                threads_run++;
                }
        }
        thread_unlock(&tmutex);
        logmsg(3, "thread %sstarted %p", t ? "" : "not ", t ? t->tid : NULL);
 
        return (t);
}
 
/* strtonum(3) from OpenBSD */
long long
strtonum(const char *numstr, long long minval, long long maxval,
    const char **errstrp)
{
        long long ll = 0;
        char *ep;
        int error = 0;
        struct errval {
                const char *errstr;
                int err;
        } ev[4] = {
                { NULL,         0 },
                { "invalid",    EINVAL },
                { "too small",  ERANGE },
                { "too large",  ERANGE },
        };
 
        ev[0].err = errno;
        errno = 0;
        if (minval > maxval)
                error = INVALID;
        else {
                ll = strtoll(numstr, &ep, 10);
                if (numstr == ep || *ep != '\0')
                        error = INVALID;
                else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
                        error = TOOSMALL;
                else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
                        error = TOOLARGE;
        }
        if (errstrp != NULL)
                *errstrp = ev[error].errstr;
        errno = ev[error].err;
        if (error)
                ll = 0;
 
        return (ll);
}
 
/* Lock mutex */
void
thread_lock(pthread_mutex_t *mutex)
{
        logmsg(3, "%s(%p)", __FUNCTION__, &mutex);
        if (pthread_mutex_lock(mutex))
                err(1, "pthread_mutex_lock");
}
 
/* Unlock mutex */
void
thread_unlock(pthread_mutex_t *mutex)
{
        logmsg(3, "%s(%p)", __FUNCTION__, &mutex);
        if (pthread_mutex_unlock(mutex))
                err(1, "pthread_mutex_unlock");
}
 
/* Output usage information */
void
usage(int status)
{
        fprintf(stdout, "usage: %s [-m <min>] [-M <max>]"
            " [-t <threads>] [path]\n", __progname);
        exit(status);
}


и тест к этой фигне
Bash
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
#!/bin/sh
 
[ $# -ne 3 ] &&
    {
        echo "usage: $(basename $0) <min> <max> <path>"
        exit 1
    }
 
MD5="md5"
uname|grep -qi linux && MD5="md5sum"
 
FIND=$(mktemp -t find.XXXXXXXXXX)
[ $? -ne 0 ] && exit 1
TDIR=$(mktemp -t tdir.XXXXXXXXXX)
[ $? -ne 0 ] &&
    {
        rm -f $FIND
        exit 1
    }
trap 'rm -f $FIND $TDIR; exit 1' 0 1 15
 
find $3 \
    -type f -and \( \
    -perm -0111 -or -perm -0110 -or -perm -0101 -or -perm -0100 \
    -or -perm -0011 -or -perm -0010 -or -perm -0001 \) \
    -and -size +$1c -and -size -$2c 2>/dev/null |sort >$FIND
FMD5=$(cat $FIND|$MD5)
 
./tdir -t4 -m$1 -M$2 $3 2>/dev/null |sort >$TDIR
TMD5=$(cat $TDIR|$MD5)
 
if [ "$FMD5" == "$TMD5" ]; then
        echo passed
        rm -f $FIND $TDIR
        exit 0
else
        diff -u $FIND $TDIR
        echo failed
        rm -f $FIND $TDIR
        exit 1
fi


Добавлено через 19 минут
Упс. вырезал vis.h для совместимости с линуксом и внес ошибку 94я строка должно быть vsnprintf
1
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 23:34  [ТС]
Да, конечно актуально.

А как вашу программу откампилировать правильно возможно(просто в своей программе мне достаточно написать gcc 3.c -lpthread -o 3,а тут чего-то еще нехватает ). На написание этого кода целая жизнь уйдет! Я где-то половину вещей, описанных в коде, вижу впервые. Осталось со своим кодом разобраться и за Вашь взяться, но тут у Вас поспрашивать придется, а то сам не смогу разобраться.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
14.04.2011, 23:37
да так же, может я какой-то bsdизм забыл убрать (но на debian lлинуксе собралось и прошло тест)
Покажите как именно ругается.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
14.04.2011, 23:59  [ТС]
А нет, все нормально, это я что-то напутал, все работает, извиняюсь за ложную тревогу.

usage: 3 [-m <min>] [-M <max>] [-t <threads>] [path]
запуск: ./3 0 3000 6 /usr
??
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.04.2011, 00:33
Похоже вам спать пора)))
-m минимальное значение
-M максимальное
-t сколько нитей можно запустить в параллель

Code
1
./3 -m0 -M3000 -t6 /usr
Добавлено через 24 минуты
кажется запинал ваш вариант, походу readdir() падает если DIR не корретный.
Как вывод - проверять все, что может вернуть ошибку.

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
void *func_thread(void *param)
{
        DIR *dp;
        struct dirent *d;
        struct stat file;
 
        dp = opendir((char*)param);
        if (dp == NULL)
                return NULL;
        while ((d = readdir(dp))) {
                if ((strlen(param) + strlen(d->d_name) + 2) > 1011)
                        continue;
 
                char path[1011];
                strcpy(path,(char*)param);
                strcat(path,"/");
                strcat(path,d->d_name);
                lstat(path, &file);
                if (S_ISDIR(file.st_mode) &&
                    strcmp(d->d_name, ".") != 0 &&
                    strcmp(d->d_name, "..") != 0) {
                        func_thread(path);
                } else {
                        if (S_ISREG(file.st_mode) &&
                            (file.st_mode & S_IXUSR) !=0 &&
                            file.st_size > atoi(s1) &&
                            file.st_size < atoi(s2)) {
                                printf("%p %s %s %lld\n",
                                    pthread_self(), (char*)param,
                                    d->d_name, file.st_size);
                                FILE *fp;
                                fp = fopen(s4,"a");
                                fprintf(fp, "%s %s %lld \n",
                                    (char*)param, d->d_name, file.st_size);
                                fclose(fp);
                        }
                }
        }
        closedir(dp);
        return NULL;
}
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
15.04.2011, 00:37  [ТС]
У Вас все просто идеально работает! Вы волшебник. Но мне совесть не позволит и преподаватель не примет(да и не поверит) такую сложную и навороченую вещицу. В ней мне еще разбиратся и разбираться. Но я надеюсь мой код можно еще реанимировать и поставить на ноги...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.04.2011, 00:44
Да не пугайтесь вы так, на самом деле все просто, и принципиально устроенно также как у вас.
Вместо массивов очереди (основная разница - нет ограничений по размеру) операции над которыми защищены мъютексом, а во стольном очень похоже.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
15.04.2011, 00:55  [ТС]
Попробывал Ваш новый вариантик и, я так понимаю, сробатывает else т.е. маловато места
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.04.2011, 00:57
Не, я почти уверен, что сегфолт был на readdir(NULL);
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
15.04.2011, 02:45  [ТС]
C++
1
2
if ((strlen(param) + strlen(d->d_name) + 2) > 1011)
                        continue;
Смотрим, у нас больше?! нет : идем дальше

заталкиваем данные в path.

C++
1
if (S_ISDIR(file.st_mode) && strcmp(d->d_name, ".") != 0 &&strcmp(d->d_name, "..") != 0) {func_thread(path);
Если не равне нулю и не содержит "." и "..", то вызываем ф-цию потока.

Вроде как, мы должны выводить данные, но мы возвращаемся на начало?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.04.2011, 08:27
Смотрим, у нас больше?! нет : идем дальше
Угу, можете переделать. Я исходил из надежды, что следующий файл может поместится.
Если не равне нулю и не содержит "." и "..", то вызываем ф-цию потока.
Вроде как, мы должны выводить данные, но мы возвращаемся на начало?
Эм... не понял. По сформулированному вами условию выводить надо только обычные (regular) файлы по маске 0111 определенного размера, а это же каталог.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
15.04.2011, 11:54  [ТС]
Угу, можете переделать. Я исходил из надежды, что следующий файл может поместится.
да нет, что понятно, то хорошо.

Ну вот смотрите: я задаю кал-во N и на этом всё: пошел работать поток, а как же нам получать данные на экране.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.04.2011, 14:57
28я строка вывод на stdout, ниже вывод какой-то файл.
Тут то все нормально, проблема одна - работает одна нить.
Нужно придумать как запускать еще N-1 ниток.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
15.04.2011, 15:49  [ТС]
Не совсем понятно, но может прокатит?
C++
1
2
3
4
5
6
7
8
9
10
11
for(i=0;i<N;i++) {
        pthread_create(&threads[i],NULL,func_thread,(void*)argv[3]);
        z++;
    }
    for(i=N;i<N;i++) {
        while(z==N) {}
        pthread_create(&threads[i],NULL,func_thread,(void*)argv[3]);
        z++;
    }
    pthread_create(&threads[i+1],NULL,func_thread,(void*)argv[3]);
    pthread_join(threads[i+1]);
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
15.04.2011, 16:08
Прокатит это в смысле удастся ли впарить это преподователю?)))
Маловероятно.
Зачем вам пускать одновременно N одинаковых нитей, потом еще сколько-то, потом еще одну, ожидать завершения последней (а кто сказал что она завершиться позже других?)?

Сейчас у вас так:
main() запускает одну нить в которой рекурсивно обходиться дерево ФС.
C
1
2
3
4
               if (S_ISDIR(file.st_mode) &&
                    strcmp(d->d_name, ".") != 0 &&
                    strcmp(d->d_name, "..") != 0) {
                        func_thread(path);
Надо:
заменить вызов func_thread() на ее же запуск в отдельной нити.
Ну и перед выходом нужно ждать завершения всех потоков (pthread_join) а не только последнего.
0
2 / 2 / 2
Регистрация: 29.11.2009
Сообщений: 320
16.04.2011, 02:07  [ТС]
Т.е. для каждой и-той нити запускать func_thread() и тут же ожидать ее завершения. Потом следующую и тоже ждать ее завершения и т.д ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.04.2011, 02:07

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru