Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 11 лет назад пользователемЭдуард Осьмухин
1 2.Система межпроцессного взаимодействия IPC 2.1.Состав, общие концепции 2.2.Очередь сообщений 2.3.Разделяемая память 2.4.Массив семафоров Взаимодействие процессов
2 Система межпроцессного взаимодействия IPC. Состав Очереди сообщений Семафоры Разделяемая память
3 Общие концепции Для именования объекта IPC используется уникальный ключ, по которому процессу возвращается дескриптор объекта Для каждого IPC-ресурса поддерживается идентификатор его владельца и структура ipc_perm (заголовочный файл ), описывающая Права доступа к нему (только две категории прав доступа по чтению и по записи) Информацию о создателе и владельце ресурса, их группе Его ключ
4 Общие концепции #include key_t ftok ( char * filename, char proj ) filename строка, cодержащая имя файла proj добавочный символ Необходимые заголовочные файлы и прототип Параметры
5 Общие концепции get ( key, …, flags ) создание/подключение Флаги cоздания/подключения: IPC_PRIVATE (доступность только породившему процессу) IPC_CREAT (создать новый или подключиться к существующему) IPC_EXCL ( + IPC_CREAT создание только нового) … Значения переменной errno при ошибках: ENOENT (ресурса нет и не указан флаг IPC_CREAT) EEXIST (ресурс существует и флаги IPC_EXCL | IPC_CREAT) EACCESS (нет прав на подключение) …
6 IPC: очередь сообщений 1.Общие концепции 2.Создание/доступ к очереди сообщений 3.Отправка сообщений 4.Получение сообщений 5.Управление очередью сообщений 6.Пример. Использование очереди сообщений 7.Пример. Очередь сообщений.Модель «клиент- сервер»
7 A BBB AAA Очередь сообщений Организация очереди сообщений по принципу FIFO Использование типов сообщений BAABABA AAAA BBB
8 Создание/доступ к очереди сообщений key уникальный идентификатор ресурса msgflag флаги, управляющие поведением вызова В случае успеха возвращается положительный дескриптор очереди, в случае неудачи возвращается –1. #include int msgget ( key_t key, int msgflag ) Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
9 Отправка сообщений msqid идентификатор очереди, полученный в результате вызова msgget() msgp указатель на буфер следующей структуры: long msgtype тип сообщения char msgtext[] данные (тело сообщения) #include int msgsnd ( int msqid, const void * msgp, size_t msgsz, int msgflg ) Необходимые заголовочные файлы и прототип Параметры
10 Отправка сообщений msgsz размер тела сообщения msgflg 0 процесс блокируется, если для посылки сообщения недостаточно системных ресурсов IPC_NOWAIT – работа без блокировки (возврат –1) #include int msgsnd ( int msqid, const void * msgp, size_t msgsz, int msgflg ) Необходимые заголовочные файлы и прототип Параметры
11 Получение сообщений msqid идентификатор очереди msgp указатель на буфер msgsz размер тела сообщения msgtyp тип сообщения, которое процесс желает получить #include int msgrcv ( int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg ) Необходимые заголовочные файлы и прототип Параметры
12 Получение сообщений msgflg побитовое сложение флагов IPC_NOWAIT если сообщения в очереди нет, то возврат –1 MSG_NOERROR разрешение получать сообщение, даже если его длина превышает емкость буфера #include int msgrcv ( int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg ) В случае успеха возвращает количество прочитанных байтов в теле сообщения. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
13 Управление очередью сообщений msgid идентификатор ресурса cmd команда IPC_STAT скопировать структуру, описывающую управляющие параметры очереди по адресу, указанному в параметре buf IPC_SET заменить структуру, описывающую управляющие параметры очереди, на структуру, находящуюся по адресу, указанному в параметре buf IPC_RMID удалить очередь #include int msgctl ( int msqid, int cmd, struct msgid_ds * buf ) Необходимые заголовочные файлы и прототип Параметры
14 Управление очередью сообщений buf структура, описывающая параметры очереди. #include int msgctl (int msqid, int cmd, struct msgid_ds *buf) В случае успеха возвращается 0. Тип msgid_ds описан в заголовочном файле, и представляет собой структуру, в полях которой хранятся права доступа к очереди, статистика обращений к очереди, ее размер и т.п. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
15 Пример. Использование очереди сообщений
16 Использование очереди сообщений int main ( int argc, char ** argv ) { key_t key; int msgid; char str [ 256 ] ; key = ftok ( "/usr/mash", s ) ; msgid = msgget ( key, 0666 | IPC_CREAT | IPC_EXCL ) ; for ( ; ; ) { gets ( str ) ; strcpy ( Message. Data, str ) ;... #include struct { long mtype ; char Data [ 256 ] ; } Message ; Основной процесс
17 ... switch ( str [ 0 ] ) { case a : case A : Message. mtype = 1 ; msgsnd ( msgid, ( struct msgbuf * ) ( & Message ), strlen ( str ) + 1, 0 ) ; break ; case b : case B : Message. mtype = 2 ; msgsnd(msgid, ( struct msgbuf * ) ( & Message ), strlen ( str ) + 1, 0 ) ; break ; case q : case Q : Message. mtype = 1 ; msgsnd ( msgid, ( struct msgbuf * ) ( & Message ), strlen ( str ) + 1, 0 ) ; Message. mtype = 2 ; msgsnd ( msgid, ( struct msgbuf * ) ( & Message ), strlen ( str ) + 1, 0 ) ; sleep ( 10 ) ; msgctl ( msgid, IPC_RMID, NULL ) ; exit ( 0 ) ; default : break ; } Использование очереди сообщений Основной процесс
18 int main ( int argc, char ** argv ) { key_t key ; int msgid ; key = ftok ( "/usr/mash", s ) ; msgid = msgget ( key, 0666 ) ; for ( ; ; ) { msgrcv ( msgid, ( struct msgbuf * ) ( & Message ), 256, 1, 0 ) ; printf ( "%s", Message. Data ) ; if ( Message. Data [ 0 ] == q || Message. Data [ 0 ] == Q ) break ; } exit () ; } #include struct { long mtype ; char Data [ 256 ] ; } Message ; Использование очереди сообщений Процесс-приемник А
19 Пример. Очередь сообщений. Модель «клиент-сервер»
20 Модель «клиент-сервер» int main ( int argc, char ** argv ) {struct { long mestype ; char mes [ 100 ] ; } messageto ; struct { long mestype ; long mes ; } messagefrom ; key_t key ; int mesid ; #include Сервер key = ftok ( "example", r ) ; mesid = msgget ( key, 0666 | IPC_CREAT | IPC_EXCL ) ; while ( 1 ) { msgrcv ( mesid, & messagefrom, sizeof ( messagefrom ) – sizeof ( long ), 1, 0 ) ; messageto. mestype = messagefrom. mes ; strcpy ( messageto. mes, Message for client ) ; msgsnd ( mesid, & messageto, sizeof (messageto ) – sizeof ( long ), 0 ) ; } return 0 ; }
21 Модель «клиент-сервер» int main ( int argc, char ** argv ) { struct { long mestype; long mes; } messageto; struct { long mestype; char mes[100]; } messagefrom; key_t key; int mesid; #include Клиент long pid = getpid () ; key = ftok ( "example", r ) ; mesid = msgget ( key, 0666 ) ; messageto. mestype = 1 ; messageto. mes = pid ; msgsnd (mesid, & messageto, sizeof (messageto) – sizeof ( long ), 0 ) ; msgrcv ( mesid, & messagefrom, sizeof ( messagefrom ) – sizeof ( long ), pid, 0 ) ; printf ( "%s", messagefrom. mes ) ; return 0 ; }
22 IPC: разделяемая память 1.Создание общей памяти 2.Доступ к общей памяти 3.Открепление разделяемой памяти 4.Управление разделяемой памятью 5.Пример. Работа с общей памятью в рамках одного процесса
23 #include int shmget ( key_t key, int size, int shmflg ) Создание общей памяти key ключ для доступа к разделяемой памяти size размер области памяти shmflg флаги управляющие поведением вызова В случае успешного завершения вызов возвращает положительное число дескриптор области памяти, в случае неудачи –1. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
24 #include char * shmat ( int shmid, char * shmaddr, int shmflg ) Доступ к разделяемой памяти shmid дескриптор области памяти shmaddr «адрес подключения» - адрес, начиная с которого необходимо подсоединить разделяемую память (>0 или =0) shmflg флаги, например, SHM_RDONLY подсоединяемая область будет использоваться только для чтения Возвращает адрес, начиная с которого будет отображаться при- соединяемая разделяемая память. При неудаче возвращается –1. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
25 #include int shmdt ( char * shmaddr ) Открепление разделяемой памяти shmaddr адрес прикрепленной к процессу памяти, который был получен при вызове shmat() В случае успешного выполнения функция возвращает 0, в случае неудачи –1. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
26 #include int shmctl ( int shmid, int cmd, struct shmid_ds * buf ) Управление разделяемой памятью shmid дескриптор области памяти cmd: IPC_STAT скопировать структуру, описывающую управляющие параметры области памяти IPC_SET заменить структуру, описывающую управляющие параметры области памяти, на структуру, находящуюся по адресу, указанному в параметре buf. IPC_RMID удалить SHM_LOCK, SHM_UNLOCK блокировать или разблокировать область памяти. buf структура, описывающая управляющие параметры области памяти. Необходимые заголовочные файлы и прототип Параметры
27 int main ( int argc, char ** argv ) { key_t key; char * shmaddr ; key = ftok ( /tmp/ter, S ) ; shmid = shmget ( key, 100, 0666 | IPC_CREAT | IPC_EXCL ) ; shmaddr = shmat ( shmid, NULL, 0 ) ; putm ( shmaddr ) ; shmctl ( shmid, IPC_RMID, NULL ) ; exit () ; } Пример. Работа с общей памятью в рамках одного процесса
28 IPC: массив семафоров 1.Создание/доступ к семафору 2.Операции над семафором 3.Управление массивом семафоров 4.Пример. Использование разделяемой памяти и семафоров
29 #include int semget ( key_t key, int nsems, int semflag ) Создание/доступ к семафору key уникальный идентификатор ресурса nsems количество семафоров semflag флаги Возвращает целочисленный идентификатор созданного разделяемого ресурса, либо -1, если ресурс не удалось создать. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
30 #include int semop ( int semid, struct sembuf *cmd_buf, size_t nops ) Операции над семафором semid идентификатор ресурса cmd_buf массив из элементов типа sembuf nops количество элементов в массиве cmd_buf Необходимые заголовочные файлы и прототип Параметры
31 Операции над семафором struct sembuf {short sem_num ; /* номер семафора */ short sem_op ; /* операция */ short sem_flg ; /* флаги операции */ } Значение семафора с номером num равно val. Если sem_op 0 то если val+sem_op < 0 то пока !(val+sem_op 0) [процесс блокирован] val=val+sem_op Если sem_op = 0 то если val 0 то пока (val 0) [процесс блокирован] [возврат из вызова]
32 #include int semctl (int semid, int num, int cmd, union semun arg) Управление массивом семафоров semid дескриптор массива семафоров num номер семафора в массиве cmd операция IPC_SET изменить значение, параметры семафора IPC_RMID удалить массив семафоров и др. arg управляющие параметры Возвращает значение, соответствующее выполнявшейся операции (по умолчанию 0), в случае неудачи –1 Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
33 #include int semctl (int semid, int num, int cmd, union semun arg) Управление массивом семафоров union semun { int val ; /* значение одного семафора */ struct semid_ds * buf ; /* параметры массива семафоров в целом (количество, права доступа, статистика доступа)*/ unsigned short * array ;/* массив значений семафоров */ } Необходимые заголовочные файлы и прототип
34 Пример. Использование разделяемой памяти и семафоров
35 Использование разделяемой памяти и семафоров int main ( int argc, char ** argv ) { key_t key; int semid, shmid ; struct sembuf sops ; char * shmaddr ; char str [ NMAX ] ; key = ftok ( /usr/ter/exmpl, S ) ; semid = semget ( key, 1, 0666 | IPC_CREAT | IPC_EXCL ) ; shmid = shmget ( key, NMAX, 0666 | IPC_CREAT | IPC_EXCL ) ; shmaddr = shmat(shmid, NULL, 0 ) ; #include #define NMAX ый процесс
36 … semctl ( semid, 0, SETVAL, (int) 0) ; sops. sem_num = 0 ; sops. sem_flg = 0 ; do { printf( Введите строку: ) ; if ( fgets ( str, NMAX, stdin ) == NULL ) strcpy ( str, Q ) ; strcpy ( shmaddr, str ) ; sops. sem_op = 3 ; semop ( semid, & sops, 1 ) ; sops. sem_op = 0 ; semop ( semid, & sops, 1 ) ; } while ( str [ 0 ] != Q ) ; shmdt ( shmaddr ) ; shmctl ( shmid, IPC_RMID, NULL); semctl ( semid, 0, IPC_RMID, (int) 0) ; return 0 ; } Использование разделяемой памяти и семафоров 1-ый процесс
37 int main ( int argc, char ** argv ) { key_t key ; int semid, shmid ; struct sembuf sops ; char * shmaddr ; char str [ NMAX ] ; key = ftok ( /usr/ter/exmpl, S ) ; semid = semget ( key, 1, 0666 ) ; shmid = shmget ( key, NMAX, 0666 ) ; shmaddr = shmat ( shmid, NULL, 0 ) ; sops.sem_num = 0 ; #include #define NMAX 256 Использование разделяемой памяти и семафоров 2-ой процесс
38 sops.sem_flg = 0; do{ printf ( Waiting… \n ) ; sops. sem_op = –2 ; semop ( semid, & sops, 1 ) ; strcpy ( str, shmaddr ) ; if ( str [ 0 ] == Q ) shmdt ( shmaddr ) ; sops. sem_op = –1 ; semop ( semid, & sops, 1 ) ; printf ( Read from shared memory: %s\n, str ) ; } while ( str [ 0 ] != Q ) ; return 0 ; } Использование разделяемой памяти и семафоров 2-ой процесс
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.