Архитектура операционной системы UNIX


         

Семафоры - часть 2


Для создания набора семафоров и получения доступа к ним используется системная функция semget, для выполнения различных управляющих операций над набором - функция semctl, для работы со значениями семафоров - функция semop.

#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #define SHMKEY 75 #define K 1024 int shmid;

main() { int i, *pint; char *addr1, *addr2; extern char *shmat(); extern cleanup();

for (i = 0; i < 20; i++) signal(i,cleanup); shmid = shmget(SHMKEY,128*K,0777IPC_CREAT); addr1 = shmat(shmid,0,0); addr2 = shmat(shmid,0,0); printf("addr1 Ox%x addr2 Ox%x\n",addr1,addr2); pint = (int *) addr1;

for (i = 0; i < 256, i++) *pint++ = i; pint = (int *) addr1; *pint = 256;

pint = (int *) addr2; for (i = 0; i < 256, i++) printf("index %d\tvalue %d\n",i,*pint++);

pause(); }

cleanup() { shmctl(shmid,IPC_RMID,0); exit(); }

Рисунок 11.11. Присоединение процессом одной и той же области разделяемой памяти дважды

#include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h>

#define SHMKEY 75 #define K 1024 int shmid;

main() { int i, *pint; char *addr; extern char *shmat();

shmid = shmget(SHMKEY,64*K,0777);

addr = shmat(shmid,0,0); pint = (int *) addr;

while (*pint == 0) ; for (i = 0; i < 256, i++) printf("%d\n",*pint++); }

Рисунок 11.12. Разделение памяти между процессами

Рисунок 11.13. Структуры данных, используемые в работе над семафорами

Синтаксис вызова системной функции semget: id = semget(key,count,flag);

где key, flag и id имеют тот же смысл, что и в других механизмах взаимодействия процессов (обмен сообщениями и разделение памяти). В результате выполнения функции ядро выделяет запись, указывающую на массив семафоров и содержащую счетчик count (). В записи также хранится количество семафоров в массиве, время последнего выполнения функций semop и semctl. Системная функция semget на , например, создает семафор из двух элементов.

Синтаксис вызова системной функции semop: oldval = semop(id,oplist,count);




Содержание  Назад  Вперед