Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск файло в заданной директории по заданной маск 
:(
    Опции темы
redwhite90
Дата 15.12.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



написал программу для поиска файлов по заданной маске в заданной директории.
программа работает в папках 
/usr/
/home/

а в / и многих других директориях этой папки не ищет.
возникает segmentation failed
проблема с правами доступа?

Добавлено через 4 минуты и 8 секунд
Код

#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
# include <dirent.h>
#include <errno.h>
#include <vector>
#include<cstring>
#include <fstream>
#include <pthread.h>
# include <sys/types.h>
# include <sys/stat.h>
# include <fnmatch.h>
using namespace std;

pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER;

extern int errno;
vector<string>directories;
vector<string>files;

struct param_

{
  string rash;
  int index;
  int count;

};

bool good_rash(string str,string rash)
{
    int k=str.find(".")+1;
    if(rash.length()!=(str.length()-k+1))
        return false;
    for(int i=1;i< rash.length();i++,k++)
        if(rash[i]!=str[k] && rash[i]!='?')
            return false;
    return true;
}

void read_dir(string way)
{
    DIR* dir;
    struct dirent* ent ;
    struct stat sb;
    string directory=way;
    dir=opendir(directory.c_str());
    while(ent=readdir(dir))
    {
        if(string(ent->d_name)!="."&& string(ent->d_name)!="..")
        {
           string new_way=way+ent->d_name+"/";
           stat(new_way.c_str(),&sb);
            if(new_way.find(".")==string::npos)//если папка
                //if((sb.st_mode & S_IFMT)==S_IFDIR)
                if ( ent->d_type & DT_DIR )
                {

                    directories.push_back(new_way);

                    read_dir(new_way);
                }

        }
    }
        closedir(dir);

}
void read_file(string mask,int index,int count)
{

    DIR* dir;
    struct dirent* ent ;
    struct stat sb;

    for(int i=index;i<count+index;i++)
    {

        dir=opendir(directories[i].c_str());
        while(ent=readdir(dir))
        {
            if(string(ent->d_name)!="."&& string(ent->d_name)!="..")
            {
               if (! (ent->d_type & DT_DIR) )
               {
                    string new_way=directories[i]+ent->d_name+"/";
                    if(fnmatch(mask.c_str(),ent->d_name,FNM_FILE_NAME)==0)
                    {
                        files.push_back(new_way);
                        cout<<new_way<<endl;
                    }

               }
            }
         }
        closedir(dir);
    }


}

void* Thread(void* pParams)
{
    int m=1;
    struct param_ *p3;
    p3=static_cast<param_*>(pParams);
    m = pthread_mutex_trylock(&mutex3);
    read_file(p3->rash,p3->index, p3->count);
    pthread_mutex_unlock(&mutex3);

}

void main_func(string way, string mask);

int main()
{
    main_func("/usr/","*.txt");
    return errno;
}

void main_func(string way, string mask)
{

    ofstream f,f2;
    pthread_t thread1, thread2,thread3;
    struct param_ *p = new struct param_;
    struct param_ *p1 = new struct param_;
    struct param_ *p2 = new struct param_;
    f.open("list.txt",ios::out);
    f2.open("files.txt",ios::out);
    //string way = "/usr/";
    directories.push_back(way);
    //string mask = "*.txt";
    read_dir(way);
    cout<<"search folders "<<endl;
    for(int i=0;i<directories.size();i++)
        f<<directories[i]<<endl;
    p->index=0;
    p->rash=mask;
    p->count=directories.size()/3;

    p1->index=p->count;
    p1->rash=mask;
    p1->count=directories.size()/3;

    p2->index=p1->index+p1->count;
    p2->rash=mask;
    p2->count=directories.size()-p1->count-p->count;
     cout<<"search files "<<endl;
    pthread_create(&thread1, NULL, Thread, (void*)(p));
    pthread_create(&thread2, NULL, Thread, (void*)(p1));
    pthread_create(&thread3, NULL, Thread, (void*)(p2));
    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    pthread_join(thread3,NULL);
    for(int i=0;i<files.size();i++)
        f2<<files[i]<<endl;
    f.close();
    f2.close();
}


Добавлено через 6 минут и 26 секунд
и даже при поиске *.* в папке /usr/ возникает segmentation fault
PM MAIL   Вверх
bsa
Дата 15.12.2011, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



запусти программу под отладчиком - он встанет на строку, вызвавшую сегфолт. Посмотришь переменные всех потоков. Возможно, race condition или выход за пределы.
PM   Вверх
redwhite90
Дата 15.12.2011, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



вылетает на строчке 
Код

::new(static_cast<void*>(__p)) _T1(_GLIBCXX_FORWARD(_T2, __value));

в файле stl_construct.h
PM MAIL   Вверх
redwhite90
Дата 15.12.2011, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



это значит, что память не получилось выделить?
PM MAIL   Вверх
boostcoder
Дата 16.12.2011, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(redwhite90 @  15.12.2011,  19:29 Найти цитируемый пост)
pthread_mutex_trylock(&mutex3);

почему тут trylock? почему мьютекс глобальный?

Цитата(redwhite90 @  15.12.2011,  19:29 Найти цитируемый пост)
vector<string>directories;
vector<string>files;

а это почему глобальное?

Цитата(redwhite90 @  15.12.2011,  21:44 Найти цитируемый пост)
память не получилось выделить?

покажи строку целиком. и номер и версию компилятора.
PM WWW   Вверх
redwhite90
Дата 16.12.2011, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



Цитата(boostcoder @  16.12.2011,  03:47 Найти цитируемый пост)
почему тут trylock? почему мьютекс глобальный?

так как read_file работает в 3 потока и все они записывают в одну структуру.

про глобальный мьютекс даже не знаю. Его лучше в Thread объявить?

Цитата(boostcoder @  16.12.2011,  03:47 Найти цитируемый пост)
vector<string>directories;vector<string>files;
а это почему глобальное?


мьютекс обязательно надо было использовать. А если  сделать всё локальное, то его существование не несёт никакого смысла.

Добавлено через 10 минут и 20 секунд
Код

 template<typename _Tp>
    inline void
    _Destroy(_Tp* __pointer)
    { __pointer->~_Tp(); }

]
так он и летит оказывается в разных местах сейчас тут вот вылетел.
ide code::blockes 10.05

а сейчас тут:

  /
Код

**
   * Constructs an object in existing memory by invoking an allocated
   * object's constructor with an initializer.
   */
  template<typename _T1, typename _T2>
    inline void
#ifdef __GXX_EXPERIMENTAL_CXX0X__
    // Allow perfect forwarding
    _Construct(_T1* __p, _T2&& __value)
#else
    _Construct(_T1* __p, const _T2& __value)
#endif
    {
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 402. wrong new expression in [some_]allocator::construct
      ::new(static_cast<void*>(__p)) _T1(_GLIBCXX_FORWARD(_T2, __value));
    }


PM MAIL   Вверх
newbee
Дата 16.12.2011, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: нет
Всего: 19



А зачем вообще разделять программу на несколько потоков? Даже в один поток она упрется в скорость чтения с диска... Или нет?


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 16.12.2011, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(newbee @  16.12.2011,  08:45 Найти цитируемый пост)
Или нет?

да. проверенно.
задание ведать такое.

PM WWW   Вверх
xvr
Дата 16.12.2011, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



Цитата(redwhite90 @  15.12.2011,  21:44 Найти цитируемый пост)
это значит, что память не получилось выделить? 

Нет, это placement new. Посмотрите стек на момент слома.
PM MAIL   Вверх
boostcoder
Дата 16.12.2011, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(redwhite90 @  16.12.2011,  07:25 Найти цитируемый пост)
так как read_file работает в 3 потока и все они записывают в одну структуру.


Цитата(redwhite90 @  16.12.2011,  07:25 Найти цитируемый пост)
про глобальный мьютекс даже не знаю. Его лучше в Thread объявить?


Цитата(redwhite90 @  16.12.2011,  07:25 Найти цитируемый пост)
мьютекс обязательно надо было использовать. А если  сделать всё локальное, то его существование не несёт никакого смысла.

наверное ты меня не правильно понял.. смотри:
Код


#include <iostream>
#include <string>
#include <vector>
#include <pthread.h>

/*************************************************************/

struct global_data {
   pthread_mutex_t mutex;
   vector<string> directories;
   vector<string> files;
};

struct param_ {
   global_data* global;
   string rash;
   int index;
   int count;
};

/*************************************************************/

void* thread_func(void* ptr) {
   struct param_* parm = (struct param_*)ptr;
   pthread_mutex_t& mutex = parm->global->mutex;
   vector<string>& directories = parm->global->directories;
   vector<string>& files = parm->global->files;

   pthread_mutex_lock(&mutex);

   ...

   directories.push_back(some dir);
   files.push_back(some file);

   ...

   pthread_mutex_unlock(&mutex);
}

/*************************************************************/

int main() {
   global_data global = { initialize };
   
   pthread_t thread1, thread2, thread3;
   
   param_ p1 = { &global, ... };
   param_ p2 = { &global, ... };
   param_ p3 = { &global, ... };
   
   pthread_create(&thread1, 0, &thread_func, &p1);
   pthread_create(&thread2, 0, &thread_func, &p2);
   pthread_create(&thread3, 0, &thread_func, &p3);

   ...
   ...

   pthread_join(thread1);
   pthread_join(thread2);
   pthread_join(thread3);

}

/*************************************************************/

идея понятна?

зы
код не проверял.

Добавлено @ 10:51
Up.

к тому же, ты пишешь на С++. это может сильно "очеловечить" код.


Это сообщение отредактировал(а) boostcoder - 16.12.2011, 10:52
PM WWW   Вверх
boostcoder
Дата 16.12.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



еще - ты не проверяешь коды завершения функций. это может сильно все усложнить.
PM WWW   Вверх
redwhite90
Дата 16.12.2011, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



boostcoder,


Код

#include <iostream>
#include <string>
#include <vector>
#include <pthread.h>

/*************************************************************/

struct global_data {
   pthread_mutex_t mutex;
   vector<string> directories;
   vector<string> files;
};

struct param_ {
   global_data* global;
   string rash;
   int index;
   int count;
};

/*************************************************************/

void* thread_func(void* ptr) {
   struct param_* parm = (struct param_*)ptr;
   pthread_mutex_t& mutex = parm->global->mutex;
   vector<string>& directories = parm->global->directories;
   vector<string>& files = parm->global->files;

   pthread_mutex_lock(&mutex);

   ...

   directories.push_back(some dir);
   files.push_back(some file);

   ...

   pthread_mutex_unlock(&mutex);
}

/*************************************************************/

int main() {
   global_data global = { initialize };
   
   pthread_t thread1, thread2, thread3;
   
   param_ p1 = { &global, ... };
   param_ p2 = { &global, ... };
   param_ p3 = { &global, ... };
   
   pthread_create(&thread1, 0, &thread_func, &p1);
   pthread_create(&thread2, 0, &thread_func, &p2);
   pthread_create(&thread3, 0, &thread_func, &p3);

   ...
   ...

   pthread_join(thread1);
   pthread_join(thread2);
   pthread_join(thread3);

}

/*************************************************************/


 я попробую попозже так, но не думаю, что дело в этом.Ведь имеется ввиду, чтобы мьютекс поглубже поставить - только на добавление в глобальную структуру ?  
Цитата(boostcoder @  16.12.2011,  10:29 Найти цитируемый пост)
Цитата(newbee @  16.12.2011,  08:45 )Или нет?да. проверенно.задание ведать такое.

именно
Цитата(xvr @  16.12.2011,  10:29 Найти цитируемый пост)
Цитата(redwhite90 @  15.12.2011,  21:44 )это значит, что память не получилось выделить?
 Нет, это placement new. Посмотрите стек на момент слома.


а что я там могу увидеть? я просто не знаю, что там хранится обычно


Это сообщение отредактировал(а) redwhite90 - 16.12.2011, 19:09
PM MAIL   Вверх
boostcoder
Дата 16.12.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 16
Всего: 110



Цитата(redwhite90 @  16.12.2011,  19:06 Найти цитируемый пост)
не думаю, что дело в этом.

ну... я и не говорил что в этом. просто предложил способ улучшить код и исключить "дыры" при обращении к глобальным переменным.

Цитата(redwhite90 @  16.12.2011,  19:06 Найти цитируемый пост)
Ведь имеется ввиду, чтобы мьютекс поглубже поставить - только на добавление в глобальную структуру ?

не понял предложения.
PM WWW   Вверх
svlary
Дата 17.12.2011, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: 4
Всего: 4



Раз уж речь идет о сопоставлении с образцом, то (наверное) было бы разумно использовать стандартные POSIX функции
  • regcomp
  • regexec

PM MAIL   Вверх
redwhite90
Дата 17.12.2011, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 14.7.2011

Репутация: нет
Всего: нет



Цитата(boostcoder @  16.12.2011,  20:16 Найти цитируемый пост)
ну... я и не говорил что в этом. просто предложил способ улучшить код и исключить "дыры" при обращении к глобальным переменным.

что подразумевается под дырами?

Добавлено через 8 минут и 46 секунд
не знаете всё-таки в чем причина может быть именно в этом коде?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0650 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.