Перейти к содержанию

Два вопроса по mmap()


Рекомендуемые сообщения

Давече, работая с mmap() наткнулся на две проблемы, которые так и не удалось решить самому Sad

Может гуру мне помогут? Smile

ВОПРОС №1:

Программа, проверяет сужествует ли файл с именем filename (при помощи open() с флагами O_CREAT | O_EXCL) если файл не существует то создаёт его и делает нужных размеров - FSIZE, потом этот файл отображаеться в память:

// Проверяем наличие файла.

if( ( fd = open( filename,

O_RDWR | O_CREAT | O_EXCL,

S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP

) ) != -1 )

{

// Записываем в файл с дескриптором fd нужное кол-во байт.

write( fd, ... );

}

...

// Получаем адрес начиная с которого нужно отображать файл.

// ( это для общего использования несколькими процессами )

shm_address = shmat (...);

.

// Отображаем файл.

if( ( mfa = mmap( shm_address,

FSIZE,

PROT_READ | PROT_WRITE,

MAP_SHARED | MAP_FIXED,

fd, 0

) ) == (void*) -1 )

...

И вот тут (если файла не было и он был только что создан программой) mmap завершаеться с ошибкой EINVAL - ему не нравиться мои параметры памяти. Почему? Файл создаётся и создаётся правильного размера (проверенно).

С другой стороны, когда файл уже существует (до запуска данной программы) всё идёт как по маслу.

Значения shm_address и в случае когда файл не существует при запуске программы (т.е. программа сама его создаёт, после чего вылетает эта ошибка) и в случае когда файл уже сужествует (до старта программы и всё идёт хорошо) одинаковы.

В чём здесь проблема?

ВОПРОС№2

Как вы заметили при отображении при отражении файла я использую флаг MAP_SHARED, в мане сказанно, что файл не будет синхронизирован до тех пор пока не будет вызван msync() или munmap().

Я вызываю:

msync( shm_address, FSIZE, MS_SYNC );

Но изменений в файле не вижу. ПАЧЕМУ!?!?!?!?!?!

Заранее благодарен за ответы!!!

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

2-й вопрос, у меня такая херня была когда файл лежал на nfs-сной шаре. Не хотел он обновлятся, хотя на локальной фс все работало тип топ.

А по поводу первого...

Где-то рабочие исходники потерялись, хотя я у себя не использовал привязку к адресу (shmat), может и вам не использовать?

Кстати на эту тему Стивенс во "Взаимодействие процессов" весьма не хило завдвинул, если нет книги купите, настоятельно рекомендую.

Ссылка на комментарий
Поделиться на другие сайты

А по первому вопросу хочу сказать, что вы пытаетесь смешать два различных способа одного и того же (аналогично выделению памати в C++, есть вариант из С, а есть родной C++, причем между собой не совместимые).

Выкинте из кода shmat, а в вызове mmap вместо адреса укажите NULL.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...