Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Механизм передачи сообщений

Семафоры

IPC

Именованный канал

При работе с именованным каналом создаем специальный файл:

mknod filename p, где p - тип файла.

Работа с именованным каналом производится также как с обычным файлом (теми же системными вызовами), за исключением того, что реально на диске информация не сохраняется, а передается от процесса, вызвавшего запись, процессу, вызвавшему чтение.

Пример:

main ()

{ int rd = open (‘имя ф. канала’, O_WRONLY);

write (fd, “Hello”, 6);

close (fd);

}

main ()

{ char buf [16];

int fd = open (‘имя ф. канала’,O_RDONLY);

read (fd, buf,16);

printf (“%s”, buf);

close (fd);

}

В IPC содержится три пакета взаимодействия:

1. механизм сообщений;

2. механизм распределения памяти;

3. семафоры.

  Cообщения Память Семафоры
Создание msgget shmget semget
Работа msgctl shmctl semctl
Настройка msgrcv msgsnd shmat shmdt semop  

 

1. Механизм сообщений позволяет принимать и посылать потоки сформированных данных.

За передачу сообщений отвечают четыре системных вызова:

msg get ≈ возвращает дескриптор сообщения;

msg clt ≈ устанавливает параметры сообщений;

msg cnt ≈ переда╦т сообщение;

msg rcv ≈ принимает сообщение.

2. Механизм распределения памяти позволяет совместно использовать отдельные части виртуального адресного пространства.

shm get ≈ создает новую область;

shm at ≈ логически присоединяет;

shm dt ≈ логически отсоединяет;

shm ctl ≈ работает с параметрами области.

3. Семафоры синхронизацию выполнения параллельных процессов. В любой момент времени над

семафором возможна только одна реализация.

sem get ≈ создание набора семафоров;

sem ctl ≈ управление этим набором;

sem op ≈ работа со значениями.

Используются для синхронизации выполнения приложений и защиты критических секций.

#defain SEMKEY 77

union semun //одно из полей буде использоваться

{

int val;

struct semid_ds *bat;

unsigned short *array;

struct seminfo *buf;

}

main()

{

union semun inisem; //для инициализации

unshort ainisem[1]={1};

int semid;

int i,j,pid;

struct sembuf p,v;

semid=semget(SEMKEY,1,0777|[IPC_CREAT]); //создание, IPC_CREAT - макрос создания, 1 – число символов, 0777 - моды доступа

inisem=ainisem; //команда

semctl(semid,0,SETALL,inisem); //инициализация

p.sem_num=0;

p.sem_op=-1;

p.sem_flg=SEM_UNDO;

v.sem_num=0;

v.sem_op=1;

v.sem_flg=SEM_UNDO;

fork();

pid=getpid(); //определяем номер процесса

for(i=0;;i<10;i++)

{

semop(semid,&p,1); // сколько операций выполнено

//критическая секция

for(j=0;g<5;g++)

{

printf(“%d%d”, pid, j);

semop(semid,&v,1);

}}

Системный вызов msgget()

Системный вызов msgget предназначен для выполнения операции доступа к очереди сообщений и, в случае ее успешного завершения, возвращает дескриптор для этой очереди (целое неотрицательное число).

int msgget(key_t key, int msgflg);

Описание системного вызова

Параметр key является ключом для очереди сообщений. Параметр msgflg – флаги – играет роль только при создании новой очереди сообщений и определяет права различных пользователей при доступе к очереди.

Возвращаемое значение

Системный вызов возвращает значение дескриптора System V IPC для очереди сообщений при нормальном завершении и значение -1 при возникновении ошибки.

Системный вызов msgsnd()

Вызов msgsnd() копирует пользовательское сообщение в очередь сообщений.

int msgsnd(int msqid, struct msgbuf *ptr, int length, int flag);

Описание системного вызова

Системный вызов копирует сообщение, расположенное по адресу, на который указывает параметр ptr, в очередь сообщений, заданную дескриптором msqid.

Параметр flag может принимать два значения: 0 и IPC_NOWAIT.

Возвращаемое значение

Системный вызов возвращает значение 0 при нормальном завершении и значение -1 при возникновении ошибки.

Системный вызов msgrcv()

int msgrcv(int msqid, struct msgbuf *ptr, int length, long type, int flag);

Описание системного вызова

Системный вызов msgrcv предназначен для получения сообщения из очереди сообщений, т. е. является реализацией примитива receive.

Параметр msqid является дескриптором для очереди, из которой должно быть получено сообщение.

Параметр length должен содержать максимальную длину полезной части информации.

Параметр flag может принимать значение 0 или быть какой-либо комбинацией флагов IPC_NOWAIT и MSG_NOERROR.

Возвращаемое значение

Системный вызов возвращает при нормальном завершении действительную длину полезной части информации (т. е. информации, расположенной в структуре после типа сообщения), скопированной из очереди сообщений, и значение -1 при возникновении ошибки.

Все прочитанные сообщения по умолчанию удаляются из очереди.

Сервер:

#define MSGKEY 81

struct msgform {

long mtype; //идентификатор сообщения

char text [256]; //данные

}

main ()

{char mas [] = {‘a’,’b’,’c’};

struct msgform msg;

int msgid, *pint;

char *pchar;

msgid = msgget (MSGKEY, 0777 IPC_CREATE);

pint = (int*) msg.txt;

pchar = (char*) msg.text;

msgrcv (msgid, &msg, sizeof (int), 8, 0) //8 – идентификатор

*pchar = mas [*pint];

msg.mtype = 9;

msgsnd (msgid, &msg, sizeof(char),0); // 0 - флаг

}

Клиент:

#define MSGKEY 81

struct msgform {

long mtype; //идентификатор сообщения

char text [256]; //данные

}

main ()

{char mas [] = {‘a’,’b’,’c’};

struct msgform msg;

int msgid, *pint, g;

char *pchar;

msgid = msgget (MSGKEY, 0777);

pint = (int*) msg.txt;

pchar = (char*) msg.text;

scanf (‘%d’, &g);

*pint = g;

msg.mtype = 8;

msgsnd (msgid, &msg, sizeof(int),0); // 0 – флаг

msgrcv (msgid, &msg, sizeof(char), g, 0);

printf (‘номер %d у буквы %c’, g, *pchar);

}

<== предыдущая лекция | следующая лекция ==>
Неименованные каналы | Поточный
Поделиться с друзьями:


Дата добавления: 2014-01-05; Просмотров: 454; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.008 сек.