Архитектура операционной системы UNIX :: Бах Морис Дж.
Страница:
595 из 715
В записи также хранится количество семафоров в массиве, времяпоследнего выполнения функций semop и semctl. Системная функция semget на Рисунке 11.14, например, создает семафор из двух элементов.
Синтаксис вызова системной функции semop:
oldval = semop(id, oplist, count);
где id — дескриптор, возвращаемый функцией semget, oplist — указатель на список операций, count — размер списка. Возвращаемое функцией значение oldval является прежним значением семафора, над которым производилась операция. Каждый элемент списка операций имеет следующий формат:
• номер семафора, идентифицирующий элемент массива семафоров, над которым выполняется операция,
• код операции,
• флаги.
#include ‹sys/types.h›
#include ‹sys/ipc.h›
#include ‹sys/sem.h›
#define SEMKEY 75
int semid;
unsigned int count;
/* определение структуры sembuf в файле sys/sem.h
struct sembuf {
unsigned shortsem_num;
short sem_op;
short sem_flg;
} ; */
struct sembuf psembuf, vsembuf;
/* операции типа P и V */
main(argc, argv)
int argc;
char *argv[];
{
int i, first, second;
short initarray[2], outarray[2];
extern cleanup();
if (argc == 1) {
for (i = 0; i ‹ 20; i++) signal(i,cleanup);
semid = semget(SEMKEY, 2, 0777IPC_CREAT);
initarray[0] = initarray[1] = 1;
semctl(semid, 2, SETALL, initarray);
semctl(semid, 2, GETALL, outarray);
printf("начальные значения семафоров %d %d\n", outarray[0], outarray[1]);
pause(); /* приостанов до получения сигнала */
} /* продолжение на следующей странице */
else
if (argv[1][0] == 'a') {
first = 0;
second = 1;
}
else {
first = 1;
second = 0;
|< Пред. 593 594 595 596 597 След. >|