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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> IPC посредством отображаемой памяти, ошибка шины 
V
    Опции темы
kosmonaFFFt
Дата 12.12.2008, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Доброго времени суток.

Требуется сделать обмен данными между двумя процессами посредством отображаемого на память файла
(один процесс создает отображение, и ждет пока другой не закинет туда чего, нить).

Пытаюсь сделать это так:
сервер - создает отображение файла и ждет клиента.
Код

#include <iostream>
#include <string>
#include <fcntl.h>
#include <sys/mman.h>
#include <errno.h>

int main(int argc, char * * argv)
{
  std::cout << "Mapped file name = [./../mf]" << std::endl;
  std::string mapped_file_name;
  std::cin >> mapped_file_name;
  //Try open file.
  int mapped_file_handle = open(mapped_file_name.c_str(), O_RDWR);

  if (mapped_file_handle < 0)
    {
      std::cout << "ERROR!!! File not opened!!!" << std::endl;
      return 1;
    }
  //Try map file.
  void * file_map = mmap(0, 10 * getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, mapped_file_handle, 0);
  if (file_map == MAP_FAILED)
    {
      std::cout << "ERROR!!! File not mapped!!!" << std::endl
                << "Error code = " << errno << std::endl;
      return 1;
    }
  close(mapped_file_handle);
  memset(file_map, 0, 10 * getpagesize());
  //Wait client.
  int * int_file_map = (int *)file_map;
  while (*int_file_map == 0)
    {
      sleep(5);
    }
  sleep(5);
  //Read matrix size.
  int matrix_size = *int_file_map;
  std::cout << matrix_size;
  //Alloc memory for matrixs.
  float * * first_matrix = new float * [matrix_size];
  float * * second_matrix = new float * [matrix_size];
  for (int index = 0; index < matrix_size; ++index)
    {
      first_matrix[index] = new float [matrix_size];
      second_matrix[index] = new float [matrix_size];
    }
  //Unmap file.
  munmap(file_map, 10 * getpagesize());
  //Free memory.
  for (int index = 0; index < matrix_size; ++index)
    {
      delete [] first_matrix[index];
      delete [] second_matrix[index];
    }
  delete [] first_matrix;
  delete [] second_matrix;
  return 0;
}


клиент - запускается после сервера, отображает файл на память и пишет туда данные:
Код

#include <iostream>
#include <string>
#include <sys/mman.h>
#include <fcntl.h>

int main(int argc, char * * argv)
{
  std::cout << "Mapped file name = [./../mf]" << std::endl;
  std::string mapped_file_name;
  std::cin >> mapped_file_name;
  //Try open file.
  int mapped_file_handle = open(mapped_file_name.c_str(), O_RDWR | O_TRUNC);
  if (mapped_file_handle < 0)
    {
      std::cout << "ERROR!!! File not opened!!!" << std::endl;
      return 1;
    }
  //Try map file.
  void * file_map = mmap(NULL, 10 * getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, mapped_file_handle, 0);
  if (file_map == MAP_FAILED)
    {
      std::cout << "ERROR!!! File not mapped!!!" << std::endl;
      return 1;
    }
  close(mapped_file_handle);
  int matrix_size = 0;
  std::cout << "Matrix size = ";
  std::cin >> matrix_size;
  //Alloc memory for matrixs.
  float * * first_matrix = new float * [matrix_size];
  float * * second_matrix = new float * [matrix_size];
  for (int index = 0; index < matrix_size; ++index)
    {
      first_matrix[index] = new float [matrix_size];
      second_matrix[index] = new float [matrix_size];
    }
  //Read matrixs.
  std::cout << "Enter first matrix:" << std::endl;
  for (int line_number = 0; line_number < matrix_size; ++line_number)
    {
      for (int column_number = 0; column_number < matrix_size; ++column_number)
        {
          std::cin >> first_matrix[line_number][column_number];
        }
    }
  std::cout << "Enter second matrix:" << std::endl;
  for (int line_number = 0; line_number < matrix_size; ++line_number)
    {
      for (int column_number = 0; column_number < matrix_size; ++column_number)
        {
          std::cin >> second_matrix[line_number][column_number];
        }
    }
  //Write matrix to file_map.
  int * int_file_map = (int *)file_map;
  *int_file_map = matrix_size;
  ++int_file_map;
  float * float_file_map = (float *)int_file_map;

  for (int line_number = 0; line_number < matrix_size; ++line_number)
    {
      for (int column_number = 0; column_number < matrix_size; ++column_number)
        {
          *float_file_map = first_matrix[line_number][column_number];
          ++float_file_map;
        }
    }
  for (int line_number = 0; line_number < matrix_size; ++line_number)
    {
      for (int column_number = 0; column_number < matrix_size; ++column_number)
        {
          *float_file_map = second_matrix[line_number][column_number];
          ++float_file_map;
        }
    }

  //Unmap file.
  munmap(file_map, 10 * getpagesize());
  //Free memory.
  for (int index = 0; index < matrix_size; ++index)
    {
      delete [] first_matrix[index];
      delete [] second_matrix[index];
    }
  delete [] first_matrix;
  delete [] second_matrix;
}


(жирным выделил запись в память)

После запуска сервера он спокойно себе висит и ждет записи в отображаемый файл,
после заапуска клиента и сервер и клиет завершаются с сообщением "Ошибка шины"

Соответственно вопрос:
Что я делаю не так и как надо?

Заранее спасибо.


--------------------
user posted image
PM MAIL ICQ   Вверх
xvr
Дата 15.12.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Клиент, строка 12:
Код

  int mapped_file_handle = open(mapped_file_name.c_str(), O_RDWR | O_TRUNC);
Файл открывается и обрезается до 0. Этот обрезок (нулевой длинны) мэпится в память, куда потом пишут (явно ЗА пределами файла, ибо куда не запиши, все будет за пределами 0  smile )
Результат - SIGBUS
Цитата

References  within  the  address  range  starting at pa and continuing for len bytes to whole pages following the end of an object shall result in delivery of a SIGBUS signal.

PM MAIL   Вверх
kosmonaFFFt
Дата 15.12.2008, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спс, но на Linuxforume ответили быстрее. smile



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

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

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


 




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


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

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