к ним используется системная функция
Для создания набора семафоров и получения доступа к ним используется системная функция 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);
Содержание Назад Вперед