Тайм-аут для функции recvfrom (сигнал SIGALRM)
Тайм-аут для функции recvfrom (сигнал SIGALRM)
В листинге 14.2 показана новая версия функции dg_cli, приведенной в листинге 8.4, в которую добавлен вызов функции alarm для прерывания функции recvfrom при отсутствии ответа в течение 5 с.
Листинг 14.2. Функция dg_cli, в которой при установке тайм-аута для функции recvfrom используется функция alarm
//advio/dgclitimeo3.c
1 #include "unp.h"
2 static void signalrm(int);
3 void
4 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
5 {
6 int n;
7 char sendline[MAXLINE], recvline[MAXLINE + 1];
8 Signal(SIGALRM, signalrm);
9 while (Fgets(sendline, MAXLINE, fp) != NULL) {
10 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
11 alarm(5);
12 if ((n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) {
13 if (errno == EINTR)
14 fprintf(stderr, "socket timeout ");
15 else
16 err_sys("recvfrom error");
17 } else {
18 alarm(0);
19 recvline[n] = 0; /* завершающий нуль */
20 Fputs(recvline, stdout);
21 }
22 }
23 }
24 static void
25 sig_alrm(int signo)
26 {
27 return; /* просто прерываем recvfrom() */
28 }
Обработка тайм-аута из функции recvfrom
8-22 Мы устанавливаем обработчик для сигнала SIGALRM и затем вызываем функцию alarm для 5-секундного тайм-аута при каждом вызове функции recvfrom. Если функция recvfrom прерывается нашим обработчиком сигнала, мы выводим сообщение об ошибке и продолжаем работу. Если получена строка от сервера, мы отключаем функцию alarm и выводим ответ.
Обработчик сигнала SIGALRM
24-28 Наш обработчик сигналов возвращает управление, прерывая блокированную функцию recvfrom.
Этот пример работает корректно, потому что каждый раз, когда мы устанавливаем функцию alarm, мы читаем только один ответ. В разделе 20.4 мы попытаемся использовать ту же технологию, но поскольку мы будем считывать множество ответов для данной функции alarm, возникнет ситуация гонок, которую нам придется разрешить.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Сигнал, импульс или поток?
Сигнал, импульс или поток? Оставим пока на время варианты CLOCK_SOFTTIME и CLOCK_MONOTONIC, поскольку они еще пока (на момент написания книги — прим. ред.) не реализованы. Втором параметром является указатель на структуру struct sigevent. Эта структура применяется для того, чтобы сообщить ядру
Стоп-сигнал
Стоп-сигнал Очень важно, чтобы тесты непрерывной интеграции все время проходили успешно. Они никогда не должны завершаться отказом. В случае отказа вся группа прекращает заниматься текущими делами и направляет все усилия на то, чтобы обеспечить успешное прохождение
5.13. Сигнал SIGPIPE
5.13. Сигнал SIGPIPE Что происходит, если клиент игнорирует возвращение ошибки из функции readline и отсылает следующие данные серверу? Это может произойти, если, например, клиенту нужно выполнить две операции по отправке данных серверу перед считыванием данных от него, причем
8.2. Функции recvfrom и sendto
8.2. Функции recvfrom и sendto Эти две функции аналогичны стандартным функциям read и write, но требуют трех дополнительных аргументов.#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen);ssize_t sendto(int sockfd, const void *buff, size_t nbytes, int flags, const struct sockaddr *to, socklen_t addrlen);Обе
Тайм-аут для функции connect (сигнал SIGALRM)
Тайм-аут для функции connect (сигнал SIGALRM) В листинге 14.1[1] показана наша функция connect_timeo, вызывающая функцию connect с ограничением по времени, заданным вызывающим процессом. Первые три аргумента — это аргументы, которых требует функция connect, а четвертый — это длительность
Тайм-аут для функции recvfrom (функция select)
Тайм-аут для функции recvfrom (функция select) Мы демонстрируем вторую технологию для установки тайм-аута (использование функции select) в листинге 14.3. Здесь показана наша функция readable_timeo, которая ждет, когда дескриптор станет готов для чтения, но не более заданного числа
Тайм-аут для функции recvfrom (параметр сокета SO_RCVTIMEO)
Тайм-аут для функции recvfrom (параметр сокета SO_RCVTIMEO) В нашем последнем примере демонстрируется применение параметра сокета SO_RCVTIMEO. Мы устанавливаем этот параметр один раз для дескриптора, задавая значение тайм-аута, и этот тайм-аут затем применяется ко всем операциям
Сигнал SIGIO и сокеты UDP
Сигнал SIGIO и сокеты UDP Использовать ввод-вывод, управляемый сигналом, с сокетами UDP довольно легко. Сигнал генерируется в следующих случаях:? на сокет прибывает дейтаграмма;? на сокете возникает асинхронная ошибка.Таким образом, когда мы перехватываем сигнал SIGIO для
Сигнал SIGIO и сокеты TCP
Сигнал SIGIO и сокеты TCP К сожалению, использовать управляемый сигналом ввод-вывод для сокетов TCP почти бесполезно. Проблема состоит в том, что сигнал генерируется слишком часто, а само по себе возникновение сигнала не позволяет выяснить, что произошло. Как отмечается в [128, с.
6.14.5 Тайм-аут сборки датаграммы
6.14.5 Тайм-аут сборки датаграммы Рассмотрим следующую последовательность событий:? Пересылается датаграмма.? Пославший ее процесс аварийно завершается.? Датаграмма фрагментируется при пересылке.? По пути следования теряется один из фрагментов.При потере отправленного
10.11.1 Тайм-аут
10.11.1 Тайм-аут Работа партнера по соединению может завершиться крахом либо полностью прерваться вследствие неисправности шлюза или связи. Чтобы предотвратить повторную пересылку данных в TCP, существует несколько механизмов.Достигнув первого порогового значения для
10.13.5 Тайм-аут повторной пересылки
10.13.5 Тайм-аут повторной пересылки После отправки сегмента TCP устанавливает таймер и отслеживает поступление ACK. Если ACK не получен в течение периода тайм-аута, TCP выполняет повторную пересылку сегмента (ретрансляцию). Однако каким должен быть период тайм-аута?Если он
13.9.1 Сигнал синхронизации
13.9.1 Сигнал синхронизации Для некоторых функций (например, Interrupt Process) включение команды в общий поток данных не приводит к нужным результатам. Когда реальный терминал посылает сигнал прерывания, хост операционной системы получает этот сигнал сразу и быстро останавливает
12.3. Отношение сигнал-шум
12.3. Отношение сигнал-шум Следующее, что нам предстоит определить, - отношение сигнал/шум при выходной мощности 1 Вт и сопротивлении нагрузки 8 Ом. Для этого амплитуда выходного напряжения должна составлять 4 В, что соответствует амплитуде входного напряжения, равной
Промзона: Проецируемый аварийный сигнал Николай Маслухин
Промзона: Проецируемый аварийный сигнал Николай Маслухин Опубликовано 06 октября 2010 года Одним из проектов, получивших награду на немецком конкурсе iF Concept Design 2010, стала работа дизайнеров Чунь-Чех Чана и Вань-Хуа Цая. Авторы использовали столь часто
Основные понятия, определяющие акустический сигнал
Основные понятия, определяющие акустический сигнал Для правильного понимания проблем обработки звука необходимо различать первичные и вторичные акустические сигналы. К первичным относятся сигналы, создаваемые музыкальными инструментами, пение, речь, а также шумовые