Гость Опубликовано 9 июля, 2004 Жалоба Поделиться Опубликовано 9 июля, 2004 Давече, работая с mmap() наткнулся на две проблемы, которые так и не удалось решить самому Может гуру мне помогут? ВОПРОС №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 ); Но изменений в файле не вижу. ПАЧЕМУ!?!?!?!?!?! Заранее благодарен за ответы!!! Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 июля, 2004 Жалоба Поделиться Опубликовано 20 июля, 2004 2-й вопрос, у меня такая херня была когда файл лежал на nfs-сной шаре. Не хотел он обновлятся, хотя на локальной фс все работало тип топ. А по поводу первого... Где-то рабочие исходники потерялись, хотя я у себя не использовал привязку к адресу (shmat), может и вам не использовать? Кстати на эту тему Стивенс во "Взаимодействие процессов" весьма не хило завдвинул, если нет книги купите, настоятельно рекомендую. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 21 июля, 2004 Жалоба Поделиться Опубликовано 21 июля, 2004 А по первому вопросу хочу сказать, что вы пытаетесь смешать два различных способа одного и того же (аналогично выделению памати в C++, есть вариант из С, а есть родной C++, причем между собой не совместимые). Выкинте из кода shmat, а в вызове mmap вместо адреса укажите NULL. Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.