Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разделяемая_память.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
154.62 Кб
Скачать

Системные вызовы

fork()

При исполнении fork() дочернии процесс наследует пристыкованные сегменты разделяемой памяти.

exec()

При исполнении exec() все подстыкованные сегменты памяти отстыковываются от процесса.

exit()

При исполнении exit() все подстыкованные сегменты памяти отстыковываются от процесса.

 

Возвращаемые значения

При ошибке обе функции возвращают -1, а переменной errno присваивается номер ошибки. При удачном выполнении shmat возвращает адрес подстыкованного сегмента памяти, а shmdt возвращает 0.  

Найденные ошибки

При ошибке функции shmat переменная errno может принимать следующие коды ошибок:

EACCES

Вызывающий процесс не имеет прав для подстыковки заданного типа.

EINVAL

Неправильное значение shmid, не выравненное по границе страницы или неправильное значение shmaddr, или ошибка подключения к brk, или SHM_REMAP было определено, но shmaddr равно NULL.

ENOMEM

Не хватает памяти для описателя или таблиц страниц.

Функция shmdt может неудачно завершиться только в одном случае: если по адресу shmaddr, нет сегмента разделяемой памяти. В этом случае errno будет содержать EINVAL.  

Замечания

Для улучшемия переносимости программ рекомендуется использовать shmat с аргументом shmaddr установленным в NULL. Необходимо учитывать, что что сегмент разделяемой памяти, пристыковываемый таким способом, может быть в разных процессах пристыкова к разным адресам. Поэтому все указатели в области разделяемой памяти должны быть не абсолютными, а относительными (как правило относительно адреса начала сегмента).

На работу системного вызова shmat влияет следующий системный параметр:

SHMLBA

Коэффициент округления нижней границы сегмента. Должен нацело делиться на размер страницы. На настоящий момент SHMBLA равен PAGE_SIZE.

В текущей реализации не существует явного предела максимального количества подстыкованных сегментов разделяемой памяти на процесс: (SHMSEG)  

Соответствие стандартам

SVr4, SVID. SVr4 описывает дополнительный код ошибки EMFILE. В SVID-v4 тип аргумента shmaddr изменен с char * на const void *, и возвращаемое значение shmat() - с char * на void *. (В Linux libc4 и libc5 в прототипе указано char *; а в glibc2 - void *.)  

typedef union semun

{

int val;

struct semid_ds *buf;

ushort *array;

} semun;

16