Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > mmap не хочет отображать память


Автор: kosmonaFFFt 9.12.2008, 16:01
Доброго всем времени суток.

имеется такой код:
Код

  //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, 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;
    }


так вот, mmap упорно не желает отображать файл на память, выдавая либо 19 ошибку (ФС
не поддерживает отображаемые на память файлы, это когда пытаюсь отобразить файл на /home
разделе), либо 9 - это неверный файловый дескриптор (когда пытаюсь отобразить файл из специально созданной папки /test на корневом разделе). Права на чтение/запись в файлы есть.
Проверял дескриптор файла на адекватность путем записи туда чего-нибудь - все нормально работает, в файло запись происходит, из файла читается. Размер файла превосходит размер страницы памяти.

Подскажите, плс, как с этим бороться.

Автор: JackYF 9.12.2008, 18:29
kosmonaFFFt, интересно. Ядро какое? Какие ФС установлены на разделах /home и /test?

Автор: kosmonaFFFt 9.12.2008, 18:58
Debian GNU/Linux Lenny Beta2
kernel = 2.6.24-1-686
ФС - ext3

кусок из fstab

Код

/dev/sda5       /               ext3         errors=remount-ro                                 0       1
/dev/sda7       /home           ext3         defaults                                          0       2

Автор: MAKCim 10.12.2008, 16:46
kosmonaFFFt, 
сходу можно сказать, что вот это условие
Код

if (mapped_file_handle == 0)
    {
      std::cout << "ERROR!!! File not opened!!!" << std::endl;
      return 1;
    }

некорректно для проверки на ошибку

Автор: kosmonaFFFt 10.12.2008, 18:03
Цитата(MAKCim @ 10.12.2008,  16:46)
kosmonaFFFt, 
сходу можно сказать, что вот это условие
Код

if (mapped_file_handle == 0)
    {
      std::cout << "ERROR!!! File not opened!!!" << std::endl;
      return 1;
    }

некорректно для проверки на ошибку

А какое корректное?

З.Ы. Проверял вручную - после открытия в файл пишет и из файла читает.

Автор: JackYF 10.12.2008, 21:17
Сколько возвратила getpagesize(), что будет, если поставить вместо этого sysconf(_SC_PAGE_SIZE) ?

Автор: MAKCim 10.12.2008, 22:41
Цитата(kosmonaFFFt @  10.12.2008,  18:03 Найти цитируемый пост)
А какое корректное?

< 0

Добавлено через 1 минуту и 38 секунд
JackYF, 
сколько бы не возвратила, главное чтобы не ноль, а не ноль будет по определению

Автор: kosmonaFFFt 12.12.2008, 21:17
Возвратила 4096, но это уже не важно, я замутил на съемном винте новый раздел, и на нем
mmap работает и файл на память отображает. Хотя раздел с теми же параметрами, что и /home.
В общем магия какая-то. smile
Думаю тему можно закрывать.
Спасибо за помощь.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)