+ Ответить в теме
Показано с 1 по 3 из 3

Тема: Распараллеливание процессов Unix

  1. #1
    Alexis777 is on a distinguished road
    Регистрация
    14.05.2018
    Сообщений
    2
    Вес репутации
    0

    Question Распараллеливание процессов Unix

    Добрый день помогите реализовать программу инвертирования содержимого файлов из нескольких подкаталогов (каждый процесс работает со своим файлом) двумя параллельными алгоритмами:
    1) с использованием сигналов и очереди сообщений;
    2) с использованием семафоров и разделяемой памяти.
    Читал теорию, но как делать не понял. Буду рад любой помощи)
    Вот теория, если кто захочет помочь) https://ru.files.fm/u/bz5m36xf#_
    Саму программу сделал:
    Код :
    1. #include <iostream>
    2. #include <fstream>
    3. #include <algorithm>
    4. #include <iterator>
    5. #include <experimental/filesystem>
    6. namespace fs = std::experimental::filesystem;
    7.  
    8. void reverseFile(fs::path pfile, fs::path const& pdir)
    9. {
    10.     std::fstream ifs(pfile, std::ios::in), ofs(pdir / pfile.filename(), std::ios::out);
    11.     if (ifs.is_open() && ofs.is_open())
    12.     {
    13.         std::string str{ std::istreambuf_iterator<char>{ifs.rdbuf()}, {} };
    14.         std::reverse_copy(str.begin(), str.end(), std::ostreambuf_iterator<char>(ofs));
    15.     }
    16.     else
    17.     {
    18.         std::cerr << "Unable to open file(s): " << pfile << "  " << pdir / pfile.filename() << "\n\n";
    19.     }
    20.     ifs.close();
    21.     ofs.close();
    22. }
    23.  
    24. // создаём путь папки в каталоге с инвертированными файлами
    25. fs::path newPath(fs::path const& oldPth, fs::path const& pd1, fs::path const& pd2)
    26. {
    27.     fs::path ret = pd2;
    28.     auto pr = std::mismatch(oldPth.begin(), oldPth.end(), pd1.begin(), pd1.end());
    29.  
    30.     for (auto ib(pr.first), ie(oldPth.end()); ib != ie; ++ib)
    31.     {
    32.         ret /= *ib;
    33.     }
    34.  
    35.     return ret;
    36. }
    37.  
    38. int main()
    39. {
    40.     try
    41.     {
    42.         fs::path pd1("C:\\dir1"); // каталог с исходными файлами
    43.         fs::path pd2("C:\\dir2"); // каталог с инвертированными файлами
    44.         if (!fs::exists(pd2))
    45.         {
    46.             fs::create_directories(pd2); // может кинуть исключение
    47.         }
    48.         for (fs::recursive_directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
    49.         {
    50.             if (fs::is_regular_file(ib->path())) // инвертируем каждый файл
    51.             {
    52.                 reverseFile(ib->path(), newPath(ib->path(), pd1, pd2));
    53.             }
    54.             else if (fs::is_directory(ib->path())) // создаём папку в каталоге с инвертированными файлами
    55.             {
    56.                 fs::create_directory(newPath(ib->path(), pd1, pd2));
    57.             }
    58.         }
    59.     }
    60.     catch (std::exception const& exc)
    61.     {
    62.         std::cerr << "Exception: " << exc.what() << std::endl;
    63.     }
    64. }
    Всем заранее спасибо за помощь)

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Alexis777 is on a distinguished road
    Регистрация
    14.05.2018
    Сообщений
    2
    Вес репутации
    0

    По умолчанию Re: Распараллеливание процессов Unix

    Также есть с потоками реализация делал:
    Код :
    1. #include <iostream>
    2. #include <fstream>
    3. #include <list>
    4. #include <pthread.h>
    5. #include <experimental/filesystem>
    6. namespace fs = std::experimental::filesystem;
    7.  
    8. pthread_mutex_t mtxCerr;
    9.  
    10. struct var
    11. {
    12.     var(fs::path const& pf1, fs::path const& pf2) : pfile1(pf1), pfile2(pf2){};
    13.     fs::path pfile1;
    14.     fs::path pfile2;
    15. };
    16.  
    17. void* reverseFile(void* arg)
    18. {
    19.     fs::path pfile1(reinterpret_cast<var*>(arg)->pfile1);
    20.     fs::path pfile2(reinterpret_cast<var*>(arg)->pfile2);
    21.     std::fstream ifs(pfile1, std::ios::in | std::ios::binary), ofs(pfile2, std::ios::out | std::ios::binary);
    22.     if (ifs.is_open() && ofs.is_open())
    23.     {
    24.         ifs.seekg(0, ifs.end);
    25.         if (ifs.tellg() >= std::streampos(1))
    26.         {
    27.             for (ifs.seekg(-1, ifs.cur); ; ifs.seekg(-2, ifs.cur))
    28.             {
    29.                 char c = ifs.get();
    30.                 //std::cout << int(c) << "  ";
    31.                 ofs.put(c);
    32.                 if (ifs.tellg() == std::streampos(1))
    33.                 {
    34.                     break;
    35.                 }
    36.             }
    37.         }
    38.     }
    39.     else
    40.     {
    41.         pthread_mutex_lock(&mtxCerr);
    42.         std::cerr << "Unable to open file(s): " << pfile1 << "  " << pfile2 << "\n\n";
    43.         pthread_mutex_unlock(&mtxCerr);
    44.     }
    45.     ifs.close();
    46.     ofs.close();
    47.  
    48.     pthread_exit(0);
    49. }
    50.  
    51. fs::path newPath(fs::path const& oldPth, fs::path const& pd1, fs::path const& pd2)
    52. {
    53.     fs::path ret = pd2;
    54.     auto pr = std::mismatch(oldPth.begin(), oldPth.end(), pd1.begin());
    55.  
    56.     for (auto ib(pr.first), ie(oldPth.end()); ib != ie; ++ib)
    57.     {
    58.         ret /= *ib;
    59.     }
    60.  
    61.     return ret;
    62. }
    63.  
    64. int main()
    65. {
    66.     try
    67.     {
    68.         fs::path pd1("/home/user/student/dir1"); // каталог с исходными файлами
    69.         fs::path pd2("/home/user/student/dir2/ddd"); // каталог с инвертированными файлами
    70.  
    71.         pthread_mutex_init(&mtxCerr, nullptr);
    72.  
    73.         if (!fs::exists(pd2))
    74.         {
    75.             fs::create_directories(pd2); // может кинуть исключение
    76.         }
    77.  
    78.         std::list<pthread_t> lt;
    79.         std::list<var> la;
    80.         for (fs::recursive_directory_iterator ib(pd1), ie; ib != ie; ++ib) // перебираем все файлы в dir 1
    81.         {
    82.             if (fs::is_regular_file(ib->path())) // инвертируем каждый файл
    83.             {
    84.                 lt.emplace_back();
    85.                 la.emplace_back(ib->path(), newPath(ib->path(), pd1, pd2));
    86.                 pthread_create(&lt.back(), nullptr, reverseFile, &la.back());
    87.             }
    88.             else if(fs::is_directory(ib->path()))
    89.             {
    90.                 fs::create_directory(newPath(ib->path(), pd1, pd2));
    91.             }
    92.         }
    93.         for(auto& thr : lt)
    94.         {
    95.             pthread_join(thr, nullptr);
    96.         }
    97.         pthread_mutex_destroy(&mtxCerr);
    98.     }
    99.     catch (std::exception const& exc)
    100.     {
    101.         std::cerr << "Exception: " << exc.what() << std::endl;
    102.     }
    103. }

  4. #3
    programmer Din666 will become famous soon enough Din666 will become famous soon enough Аватар для Din666
    Регистрация
    17.07.2015
    Адрес
    Moscow
    Сообщений
    50
    Вес репутации
    5

    По умолчанию Re: Распараллеливание процессов Unix

    так все-таки процессы или потоки? "(каждый процесс работает со своим файлом)"

+ Ответить в теме

Похожие темы

  1. Список процессов
    Напишите пожалуйсто такую программу: Окошко со списком процессов и кнопка добавить Типо выдиляешь процесс жмеш добавить и он добавляеться в файл...
    от Hacker-Andrey в разделе задачи на C и C++
  2. Список процессов
    от Hacker-Andrey в разделе C и C++
  3. АпачЮ размножение процессов
    Сегодня обнаружил, что машина (FreeBSD) умерла. Вернее не умерла, но оказалась настолько загруженной, что даже с консоли под рутом по минуте...
    от isms.ru в разделе Apache, IIS...
  4. Администратор инфраструктуры UNIX и SAN ( IK - M - Unix )
    Компания: специализируется на предоставлении широкого спектра ИТ-услуг и поставке бизнес-решений. Требования: • Опыт работы к качестве...
    от youth в разделе Вакансии и заказы для программистов
  5. Как убрать прогу из списа процессов
    Кто-нибудь подскажите как убрать прогу из списа процессов?
    от fikys в разделе Delphi и Pascal

Ваши права

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