
- •Int getsem(void) /* Получить набор семафоров */
- •Описание
- •Int shm_segsz; /* размер сегмента (в байтах) */
- •Системные вызовы
- •Возвращаемые значения
- •Найденные ошибки
- •Замечания
- •Системные вызовы
- •Возвращаемые значения
- •Найденные ошибки
- •Системные вызовы
- •Возвращаемые значения
- •Найденные ошибки
- •Замечания
- •Соответствие стандартам
Системные вызовы
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;