filename — строка, cодержащая имя файла
proj — добавочный символ
Необходимые заголовочные файлы и прототип
Параметры
#include Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
#include
#include
int msgget ( key_t key, int msgflag )
#include Необходимые заголовочные файлы и прототип Параметры
#include
#include
int msgsnd ( int msqid, const void * msgp, size_t msgsz, int msgflg )
#include Необходимые заголовочные файлы и прототип Параметры
#include
#include
int msgsnd ( int msqid, const void * msgp, size_t msgsz, int msgflg )
#include Необходимые заголовочные файлы и прототип Параметры
#include
#include
int msgrcv ( int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg )
#include В случае успеха возвращает количество прочитанных байтов в теле сообщения. Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
#include
#include
int msgrcv ( int msqid, void * msgp, size_t msgsz, long msgtyp, int msgflg )
#include Необходимые заголовочные файлы и прототип Параметры
#include
#include
int msgctl ( int msqid, int cmd, struct msgid_ds * buf )
В случае успеха возвращается 0.
Тип msgid_ds описан в заголовочном файле Необходимые заголовочные файлы и прототип Параметры Возвращаемое значение
#include Основной процесс
#include
#include
#include
struct
{
long mtype ;
char Data [ 256 ] ;
} Message ;
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 ;
}
}
}
Использование очереди сообщений
Основной процесс
#include Использование очереди сообщений Процесс-приемник А
#include
#include
#include
struct {
long mtype ;
char Data [ 256 ] ;
} Message ;
#include Сервер key = ftok ( "example", ‘r’ ) ;
#include
#include
#include
#include
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 ;
}
#include Клиент long pid = getpid () ;
#include
#include
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 ;
}
IPC: разделяемая память
key — ключ для доступа к разделяемой памяти
size — размер области памяти
shmflg — флаги управляющие поведением вызова
дескриптор области памяти, в случае неудачи — –1.
Создание общей памяти
Параметры
Возвращаемое значение
Доступ к разделяемой памяти
shmid — дескриптор области памяти
shmaddr — «адрес подключения» - адрес, начиная с которого необходимо подсоединить разделяемую память (>0 или =0)
shmflg — флаги, например, SHM_RDONLY подсоединяемая область будет использоваться только для чтения
Возвращает адрес, начиная с которого будет отображаться при-соединяемая разделяемая память. При неудаче возвращается –1.
Необходимые заголовочные файлы и прототип
Параметры
Возвращаемое значение
shmaddr — адрес прикрепленной к процессу памяти, который был получен при вызове shmat()
В случае успешного выполнения функция возвращает 0, в случае неудачи — –1.
Необходимые заголовочные файлы и прототип
Параметры
Возвращаемое значение
Управление разделяемой памятью
shmid — дескриптор области памяти
cmd:
IPC_STAT — скопировать структуру, описывающую управляющие параметры области памяти
IPC_SET — заменить структуру, описывающую управляющие параметры области памяти, на структуру, находящуюся по адресу, указанному в параметре buf.
IPC_RMID удалить
SHM_LOCK, SHM_UNLOCK — блокировать или разблокировать область памяти.
buf — структура, описывающая управляющие параметры области памяти.
Необходимые заголовочные файлы и прототип
Параметры
Пример. Работа с общей памятью в рамках одного процесса
Создание/доступ к семафору
key — уникальный идентификатор ресурса
nsems — количество семафоров
semflag — флаги
Возвращает целочисленный дескриптор созданного разделяемого ресурса, либо -1, если ресурс не удалось создать.
Необходимые заголовочные файлы и прототип
Параметры
Возвращаемое значение
Операции над семафором
semid — дескриптор ресурса
cmd_buf — массив из элементов типа sembuf
nops — количество элементов в массиве cmd_buf
Необходимые заголовочные файлы и прототип
Параметры
Значение семафора с номером num равно val.
Если sem_op ≠ 0 то
пока (val+sem_op < 0) [процесс блокирован]
val=val+sem_op
Если sem_op = 0 то
пока (val ≠ 0) [процесс блокирован]
[возврат из вызова]
Управление массивом семафоров
semid — дескриптор массива семафоров
num — номер семафора в массиве
cmd — операция
IPC_SET изменить значение, параметры семафора
IPC_RMID удалить массив семафоров
и др.
arg — управляющие параметры
Возвращает значение, соответствующее выполнявшейся операции (по умолчанию 0), в случае неудачи — –1
Необходимые заголовочные файлы и прототип
Параметры
Возвращаемое значение
Управление массивом семафоров
Необходимые заголовочные файлы и прототип
union semun
{
int val ; /* значение одного семафора */
struct semid_ds * buf ; /* параметры массива семафоров в целом (количество, права доступа, статистика доступа)*/
unsigned short * array ; /* массив значений семафоров */
}
#include 1-ый процесс
#include
#include
#include
#include
#define NMAX 256
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-ый процесс
#include Использование разделяемой памяти и семафоров 2-ой процесс
#include
#include
#include
#include
#define NMAX 256
Использование разделяемой памяти и семафоров
2-ой процесс
Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:
Email: Нажмите что бы посмотреть