Нарушение сегмента при попытке инициализировать отображенный в память файл - PullRequest
1 голос
/ 31 октября 2008

Ниже приведен код, который я использовал для создания memory mapped file:

fid = open(filename, O_CREAT | O_RDWR, 0660);

if ( 0 > fid )
{
    throw error;
}

/* mapped offset pointer to data file */
offset_table_p = (ubyte_2 *) shmat(fid, 0, SHM_MAP);

/* Initialize table */
memset(offset_table_p, 0x00, (table_size + 1) * 2);

скажем, размер таблицы равен 2XXXXXXXX байт.

Во время отладки я заметил, что она не работает при попытке инициализации «указателя таблицы смещения»,

Может ли кто-нибудь дать мне некоторые сведения о том, почему происходит сбой во время инициализации? Есть ли какие-либо возможности, что мой файл карты памяти не был создан с требуемым размером таблицы?

Ответы [ 2 ]

2 голосов
/ 31 октября 2008

Насколько я могу судить по чтению документации, вы делаете это совершенно неправильно.

Либо используйте open () и mmap (), либо используйте shmget () и shmat ().

Если вы используете open (), вам сначала нужно сделать файл достаточно длинным. Для этого используйте ftruncate ().

0 голосов
/ 31 октября 2008

Перво-наперво:

Проверьте файл как до, так и после вызова open (). Если в Linux вы можете использовать код:

char paxbuff[1000];                            // at start of function
sprintf (paxbuff,"ls -al %s",filename);
system (paxbuff);
fid = open(filename, O_CREAT | O_RDWR, 0660);  // this line already exists.
system (paxbuff);

Затем, после вызова shmat (), проверьте возвращаемые значения и размер следующим образом:

offset_table_p = (ubyte_2 *) shmat(fid, 0, SHM_MAP);  // already exists.
printf ("ret = %p, errno = %d\n",offset_table_p,errno);
printf ("sz = %d\n",table_size);

Этого должно быть достаточно, чтобы решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...