Главная страница  Взаимодействие нетривиальных процессов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 [ 116 ] 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

Обратите внимание, что эта функция не удаляет сегмент разделяемой памяти. Удаление осуществляется функцией 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. д. */ продолжение-



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 [ 116 ] 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.