Главная страница Взаимодействие нетривиальных процессов Обратите внимание, что эта функция не удаляет сегмент разделяемой памяти. Удаление осуществляется функцией shmctl с командой IPC RMID. 14.5. Функция shmctl Функция shmctl позволяет выполнять различные операции с сегментом разделяемой памяти: finclude <sys/shtti.h> int shmctl (int shniid. int and. struct shmid ds *buff): I* Возвращает 0 в случае успешного завершения. -1 в случае ошибки */ Команд (значений аргумента cmd) может быть три: ш IPC RMID - удаление сегмента разделяемой памяти с идентификатором shmid из системы; ш I PC SET - установка значений полей структуры shmi d ds для сегмента разделяемой памяти равными значениям соответствующих полей структуры, на которую указывает аргумент buff: shm perm.uid, shm perm.gid, shm perm.mode. Значение поля shm cti me устанавливается равным текущему системному времени; Ш. I PC STAT - возвращает вызывающему процессу (через аргумент buff) текущее значение структуры shmid ds для указанного сегмента разделяемой памяти. 14.6. Простые программы в этом разделе приведено несколько примеров простых программ, иллюстрирующих работу с разделяемой памятью System V. Программа shmget Программа shmget, текст которой приведен в листинге 14.1, создает сегмент разделяемой памяти, принимая из командной строки полное имя и длину сегмента. Листинг 14.1. Создание сегмента разделяемой памяти System V указанного размера svshm/shmget.c 1 finclude unpipc.h 2 int 3 main(int argc. char **argv) 5 int c. id. oflag: 6 char *ptr: 7 slze t length: 8 oflag = SVSHM MODE IPC CREAT; 9 while ( (c = Getopt(argc. argv. e )) != -1) { 10 switch (c) { 11 case e: 12 oflag h IPCJXCL: продолжение Л1ЛСТ1ЛНГ\4.\ (продолжение) 13 break: 14 } 15 } 16 lf (optind != argc - 2) 17 err quit( usage: shmget [ -e ] <pathname> <length> ): 18 length = atoi(argv[optind + 1]): 19 id = Shmget(Ftok(argv[optind]. 0). length, oflag): 20 ptr = Shmat(id. NULL. 0): 21 exit(O): 22 } 19 Вызов shmget создает сегмент разделяемой памяти указанного размера. Полное имя, передаваемое в качестве аргумента командной строки, преобразуется в ключ IPC System V вызовом ftok. Если указан параметр -е, наличие существующего сегмента с тем же именем приведет к возвращению ошибки. Если мы знаем, что сегмент уже существует, в командной строке должна быть указана нулевая длина. 20 Вызов shmat подключает сегмент к адресному пространству процесса. После этого программа завершает работу. Разделяемая память System V обладает по меньшей мере живучестью ядра, поэтому сегмент разделяемой памяти при этом не удаляется. Программа shmrmid В листинге 14.2 приведен текст тривиальной программы shmrmid, которая вызывает shmctl с командой IPC RMID для удаления сегмента разделяемой памяти из системы. Листинг 14.2. Удаление сегмента разделяемой памяти System V из системы svshm/shmrmid.c 1 finclude unpipc.h 2 int 3 maindnt argc. char **argv) 5 int id; 6 if (argc 1- 2) 7 err quit( usage: shmrmid <pathname> ); 8 id = Shmget(Ftok(argv[l]. 0). 0. SVSHM MODE): 9 Shmctl(id. IPC RMID. NULL): 10 exit(O); 11 } Листинг 14.3. Заполнение сегмента разделяемой памяти последовательностью чисел svshm/shmwrite.c 1 finclude unpipc.h 2 int 3 mainCint argc. char **argv) 5 int i. id: 6 struct shmid ds buff: 7 unsigned char *ptr: 8 if (argc != 2) 9 err quit( usage: shmwrite <pathname> ): 10 id = Shmget(Ftok(argv[l]. 0). 0. SVSHM MODE): 11 ptr - Shmat(id. NULL. 0): 12 Shmctl(id. IPC STAT. &buff): 13 /* присваиваем: ptr[0] = 0. ptr[l] = 1 и i. д. */ 14 for (i - 0: 1 < buff.shm segsz: 15 *ptr++ = i % 256; 16 exit(O); 17 } Программа shmwrite в листинге 14.3 приведен текст программы shmwrite, которая заполняет сегмент разделяемой памяти последовательностью значений 0,1, 2,..., 254, 255,0,1 и т. д. 10-12 Сегмент разделяемой памяти открывается вызовом shmget и подключается вызовом shmat. Его размер может быть получен вызовом shmctl с командой IPC STAT. 13-15 В разделяемую память записывается последовательность значений. Программа shmread Программа shmread, текст которой приведен в листинге 14.4, проверяет последовательность значений, записанную в разделяемую память программой shmwrite. Листинг 14.4. Проверка значений в сегменте разделяемой памяти svshm/shmread.c 1 finclude unpipc.h 2 int 3 maindnt argc. char **argv) 5 int i. id: 6 struct shmid ds buff; 7 unsigned char c. *ptr; 8 if (argc != 2) 9 err quit( usage: shmread <pathname> ): 10 id = Shmget(Ftok(argv[l]. 0). 0. SVSHM MODE); 11 ptr = Shmat(id. NULL, 0); 12 Shmctl(id, IPCSTAT, &buff); /* проверка значений ptr[0] = 0, ptr[l] = 1 и i. д. */ продолжение-
|
© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования. |