UNIX: взаимодействие процессов
Шрифт:
13.3. Функции ftruncate и fstat
Размер файла или объекта разделяемой памяти можно изменить вызовом ftruncate:
Стандарт Posix делает некоторые различия в определении действия этой функции для обычных файлов и для объектов разделяемой памяти.
1. Для обычного файла: если размер файла превышает значение length, избыточные
2. Для объекта разделяемой памяти: ftruncate устанавливает размер объекта равным значению аргумента length.
Итак, мы вызываем ftruncate для установки размера только что созданного объекта разделяемой памяти или изменения размера существующего объекта. При открытии существующего объекта разделяемой памяти следует воспользоваться fstat для получения информации о нем:
В структуре stat содержится больше десятка полей (они подробно описаны в главе 4 [21]), но только четыре из них содержат актуальную информацию, если fd представляет собой дескриптор области разделяемой памяти:
Пример использования этих двух функций будет приведен в следующем разделе.
ПРИМЕЧАНИЕ
К сожалению, стандарт Posix никак не оговаривает начальное содержимое разделяемой памяти. Описание функции shm_open гласит, что «объект разделяемой памяти будет иметь нулевой размер». Описание ftruncate гласит, что для обычных файлов (не объектов разделяемой памяти) «при увеличении размера файла он будет дополнен нулями». Однако в этом описании ничего не говорится о содержимом разделяемой памяти. Обоснование Posix.1 (Rationale) говорит, что «разделяемая память при расширении дополняется нулями», но это не официальный стандарт. Когда автор попытался уточнить этот вопрос в конференции comp.std.unix, он узнал, что некоторые производители протестовали против введения требования на заполнение памяти нулями из-за возникающих накладных расходов. Если новая область памяти не инициализируется каким-то значением (то есть содержимое остается без изменения), это может угрожать безопасности системы.
13.4. Простые программы
Приведем несколько примеров программ, работающих с разделяемой памятью Posix.
Программа shmcreate
Программа shmcreate, текст которой приведен в листинге 13.1, [1] создает объект разделяемой
памяти с указанным именем и длиной.1
Все исходные тексты, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com/download.
19-22 Вызов shm_open создает объект разделяемой памяти. Если указан параметр –е, будет возвращена ошибка в том случае, если такой объект уже существует. Вызов ftruncate устанавливает длину (размер объекта), a mmap отображает его содержимое в адресное пространство процесса. Затем программа завершает работу. Поскольку разделяемая память Posix обладает живучестью ядра, объект разделяемой памяти при этом не исчезает.
Программа shmunlink
В листинге 13.2 приведен текст тривиальной программы, удаляющей имя объекта разделяемой памяти из системы.
Программа shmwrite
В листинге 13.3 приведен текст программы shmwrite, записывающей последовательность 0, 1, 2 254, 244, 0, 1 и т. д. в объект разделяемой памяти.