- •20 Билет
- •1)Установление связи
- •2) Передача данных
- •2.Системные вызовы
- •3.Примеры
- •2 Билет.
- •1.Управление процессами
- •2. Сигналы.
- •3 Билет
- •1.Обработка Сигнала
- •2) Группы процессов
- •3)Примеры
- •4 Билет
- •1)Посылка сигналов процессами
- •2)Межпроцессные комуникации
- •3)Примеры в качестве примера можно привести программу ,которая принимает сигналы о прерывании (sigint) и сама посылает их (в результате выполнения функции kill
- •5 Билет.
- •6 Билет.
- •7 Билет
- •1)Атомарные (неделимые) операции с каналами
- •2)Примечания к полудуплексным каналам
- •8 Билет
- •1)Именованные каналы (fifo: First In First Out): основные понятия
- •2)Операции с fifo
- •3) Примеры
- •9 Билет
- •1) Базовые понятия System V ipc
- •2) Идентификаторы ipc
- •10 Билет
- •11 Билет
- •1)Буфер сообщения
- •13 Билет
- •1)Системный вызов msgctl
- •2)Семафоры. Основные понятия
- •1)Системный вызов semget.
- •2) Системный вызов semop.
- •15 Билет
- •1) Системный вызов semctl
- •2) Разделяемая память. Основные понятия.
- •3) Примеры
- •16 Билет
- •1) Системный вызов shmget
- •2) Системный вызов shmctl
- •3) Примеры
- •17 Билет
- •Системный вызов shmat
- •Системный вызов shmdt
- •18 Билет
- •Системный вызов mmap
- •19 Билет
- •1) Создание сокета
- •2) Привязка к локальным именам
- •3) Примеры:
- •20 Билет
- •1)Установление связи
- •2) Передача данных
- •3) Примеры Установление связи
- •Передача данных
- •21 Билет
- •1. Закрытие сокетов.
- •22 Билет.
- •1) Алгоритмы
- •2) Оценки эффективности алгоритмов.
- •3) Примеры
- •23 Билет
- •1.Ядро операционной системы
- •2.Системные вызовы
- •3.Примеры
- •24 Билет.
- •25 Билет
- •1) Системный вызов semctl
- •2) Разделяемая память. Основные понятия.
- •3) Примеры
- •26 Билет
- •1) Группы процессов
- •2)Обработка Сигнала
- •3)Примеры
- •27 Билет
- •1) Создание сокета
- •2) Привязка к локальным именам
- •3) Примеры:
- •28 Билет.
- •29 Билет
- •1. Закрытие сокетов.
- •30 Билет
- •1)Установление связи
- •2) Передача данных
- •3) Примеры Установление связи
- •Передача данных
29 Билет
1. Закрытие сокетов.
Когда взаимодействующие модули решают прекратить передачу данных и закрыть сеанс связи, они обмениваются трехсторонним рукопожатием с сегментами, содержащими установленный бит.
«От отправителя больше нет данных» (этот бит еще называется FIN бит).
Если сокет больше не используется, процесс может закрыть его с помощью функции close, вызвав ее с соответствующим дескриптором сокета в качестве аргумента: close(s);
Если данные были ассоциированы с сокетом, обещающим доставку (сокет типа stream), система будет пытаться осуществить передачу этих данных. Тем не менее, по истечении довольно длительного промежутка времени, если данные все еще не доставлены, они будут отброшены. Если пользовательский процесс желает прекратить любую передачу данных, он может сделать это с помощью вызова shutdown на данном сокете для его закрытия. Вызов shutdown осуществляет «моментальное» отбрасывание всех стоящих в очереди данных. Формат вызова следующий: shutdown(s, how);
Параметр how имеет одно из следующих значений:
0 - пользователь больше не желает читать данные;
1 - данные больше не будут посылаться;
2 - данные не будут ни посылаться, ни получаться.
2. Мультиплексирование ввода-вывода. Функции poll и select.
В случае использования протокола UDP соединение не устанавливается и для обработки нескольких клиентов. Чтобы избежать блокирования процесса в случае чтения из сокетов, можно использовать функции мультиплексированного ввода-вывода.
Функции select и poll ожидают разнообразных событий в файловых дескрипторах.
Системный вызов select.
int select(int n, fd_set *readfds, fd_set *writefds,
fd_set *exceptfds, struct timeval);
В качестве первого параметра в функции select указывают максимальное значение обслуживаемого файлового дескриптора плюс 1,readfds-множество файловых дескрипторов, в которых ожидается события на чтение, writefds- на запись, exceptfds- на удаление. Последний параметр используется для задания тайм-аута, по истечении которого, даже если никакого события не произошло, программа разблокируется, а select возвращает 0. В случае, если какое-либо событие все-таки произошло,функция возвращает номер файлового дескриптора в множестве. В случае ошибки возвращается -1. Рассмотрим пример использования функции select, в нем ожидается в течение 5 секунд ввод с клавиатуры, в противном случае программа заканчивается с сообщением о том, что вышел тайм-аут:
fd_set rfds;
struct timeval tv;
int retval;
/* Ждем, пока на стандартном вводе (fd 0) что-нибудь появится. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Ждем не больше пяти секунд. */tv.tv_sec = 5; tv.tv_usec = 0; retval = select(1, &rfds, NULL, NULL, &tv);
/* Не полагаемся на значение tv! */if (retval) printf("Данные доступны.\n");
/* Теперь FD_ISSET(0, &rfds) вернет истинное значение. */
else
printf("Данные не появились в течение пяти секунд.\n");
...
В примере используются несколько макросов для работы с множеством дескрипторов:
•FD_ZERO- очищает набор;
•FD_SET и FD_CLR- добавляют или удаляют заданный де
скриптор из набора;
•FD_ISSET- проверяет, является ли дескриптор частью набора;
этот макрос полезен после возврата из функции select.
Системный вызов poll.
int poll(struct pollfd *ufds, unsigned int nfds, int timeout);
Системный вызов poll имеет аналогичную функциональность с select.
Здесь задается массив из nfds структур типа
struct pollfd {
int fd; /* файловый дескриптор */
short events; /* запрошенные события */
short revents; /* возвращенные события */
};
И timeout в миллисекундах. Отрицательное значение означает бесконечный тайм-аут. Необходимо заполнить значение полей
fd, установив номер открытого файлового дескриптора, и
events, в который нужно установить тип обрабатываемого события, например, POLLIN для чтения данных или POLLOUT
для записи. Поле revents- выходной параметр, куда ядро помещает информацию о произошедших событиях- запрошенных или событий типа
POLLERR(произошла ошибка),POLLHUP(закрыли дескриптор),
POLLNVAL(неверный запрос:fd не открыт).
