64.58K
Категория: ПрограммированиеПрограммирование

Inter-Process Communication (IPC)

1.

Inter-Process Communication (IPC)
Межпроцессное взаимодействие

2.

Механизмы взаимодействия
Синхронизации
– Сигналы
– Семафоры
Коммуникации
– Неименованные каналы (pipe)
– Именованные каналы (FIFO)
– Очередь сообщений
– Разделяемая память
– Сокеты

3.

Сигналы
Используются в качестве средства
уведомления о некотором событии
Передаются от одного процесса другому
Не могут переносить информацию
Информация о сигналах
$ man signal.h

4.

Сигналы
SIGKILL - сигнал уничтожения процесса
SIGINT - сигнал прерывания программы
SIGALARM - сигнал таймера процесса.
Таймер устанавливается при помощи
вызова alarm()
SIGBUS - сигнал об ошибке на шине.
Возникает при аппаратной ошибке
SIGILL — недопустимая операция
процесса.

5.

Сигналы
Процесс может
– Посылать сигнал другим процессам
– Реагировать на определенный тип сигнала,
в том числе и изменять обработку сигнала
– Блокировать сигналы на время выполнения
определенных критических участков кода

6.

Сигналы
Для определения метода обработки
сигналов используется процедура
sigaction(int signo,
const struct sigaction *act,
struct sigaction *oact);
man sigaction

7.

Сигналы
struct sigaction {
void
(*sa_handler)(int);
sigset_t
sa_mask;
int
sa_flags;
void
(*sa_restorer)(void);
};

8.

Семафоры
Счетчики управляющие доступом к общим
ресурсам
Системные вызовы
– semget(int
semflg)
– semop(int
key, int nsems, int
semid, struct sembuf
*sops, unsigned nsops)

9.

Семафоры
semget(int key, int nsems, int semflg)
IPC_CREATE — создается новое множество
семафоров. Если уже существует —
вернется дескриптор старого множества.
IPC_EXCL — успешно выполнится только в
том случае, если множества семафоров не
существует. В противном случае вернет -1

10.

Семафоры
struct sembuf
{
/* semaphore number */
unsigned short int sem_num;
/* semaphore operation */
short int sem_op;
};
/* operation flag */
short int sem_flg;
IPC_NOWAIT — если данный флаг не установлен, то
вызывающий процесс блокируется, пока семафор не
выдаст требуемое количество ресурсов

11.

Неименованные каналы
Средство связи одного процесса с другим
Используются для коммуникации
родительского и дочерних процессов
int pipe(int fd[2]);
– fd[0]
— для чтения
– fd[1]
— для записи
Необходимо закрывать неиспользуемую
сторону канала

12.

Именованные каналы
Существуют в виде специального файлаустройства в файловой системе
$ mkfifo MYFIFO
mknod("/tmp/MYFIFO", S_FIFO|0666,
0)
Процессы различного происхождения могут
разделять данные
Именованный канал остается в системе
после того, как все операции ввода/вывода
завершены

13.

Очереди сообщений
Получение существующей или созданий
новой очереди
msgget(key_t key, int permflags)
IPC_CREATE — создается новая очередь.
Если уже существует — вернется
дескриптор старой очереди
IPC_EXCL — успешно выполнится только в
том случае, если очереди сообщений не
существует. В противном случае вернет -1

14.

Очереди сообщений
Буфер сообщения
struct msgbuf {
long mtype;
/*тип сообщения*/
char mtext[1]; /*текст
сообщения*/
}
Отправка сообщений
int msgsnd(int msqid,
struct msgbuf *msgp,
int size,

15.

Очереди сообщений
Прием сообщений
int msgrcv(int msqid,
struct msgbuf *msgp,
int size,
long mtype,
int msgflg)
IPC_NOWAIT — если данный флаг не установлен, то
вызывающий процесс блокируется, пока не примет
сообщение указанного типа

16.

Разделяемая память
Системные вызовы
int shmget(key_t key,
int size,
int shmflg)
int shmat(int shmid,
char *shmaddr,
int shmflg)
int shmdt(char *shmaddr)

17.

Сокеты
Целью сокетов является обеспечение
средства межпроцессного взаимодействия
для двунаправленного обмена
сообщениями между двумя процессами
независимо от того, находятся они на
одном компьютере или разных
Способы передачи
– Модель соединений (TCP)
– Модель дейтаграмм (UDP)

18.

Сокеты
Для хранения информации об адресе и
порте используется структура
struct sockaddr {
sa_family_t sa_family;
char sa_data[];
}

19.

Сокеты
Сокеты для связи через сеть имееют
следующую структуру
struct sock_addr_in {
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
}

20.

Сокеты
Создание сокетов
int socket (int domain, int type, int
protocol)
Домен
– AF_INET
Internet
— будет использоваться домен
– AF_UNIX
— процессы находятся на одном
и том же компьютере
Тип
– SOCK_STREAM
соединений
– SOCK_DGRAM
— режим виртуальных
— режим дейтаграмм

21.

Сокеты
Связывание
int bind (int sockfd,
const struct sockaddr *address,
size_t addr_len)
Включение приёма соединений
int listen (int sockfd, int queue_size)
Прием запроса на установку соединения
После получения от клиента запроса на соединение,
сервер должен создать новый сокет для работы с новым
соединением
int accept (int sockfd,
struct sockaddr *address,
size_t *addr_len)

22.

Сокеты
Отправка данных
ssize_t send (int sockfd,
void * buffer,
size_t length,
int flags)
Прием данных
ssize_t recv (int sockfd,
void * buffer,
size_t length,
int flags)
Закрытие соединения
int close (int sockfd)
English     Русский Правила