UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
struct hostent *hptr;
...
signal(SIGALRM, sig_alrm);
...
hptr = gethostbyname( ... );
...
}
void
sig_alrm(int signo) {
struct hostent *hptr;
...
hptr = gethostbyname( ... );
...
}
Если главный поток управления в момент остановки находится в середине выполнения функции
gethostbyname
host
gethostbyname
host
Если мы посмотрим на функции преобразования имен и адресов, представленные в этой главе и в главе 9, вместе с функциями
inet_<i>XXX</i>
■ Функции
gethostbyname
gethostbyname2
gethostbyaddr
getservbyname
getservbyport
Некоторые реализации, поддерживающие программные потоки (Solaris 2.x), предоставляют версии этих четырех функций, допускающие повторное вхождение, с именами, оканчивающимися суффиксом
_r
В качестве альтернативы некоторые реализации с поддержкой программных потоков (Digital Unix 4.0 и HP_UX 10.30) предоставляют версии этих функций, допускающие повторное вхождение за счет использования собственных данных программных потоков.
■ Функции
inet_pton
inet_ntop
■ Исторически функция
inet_ntoa
■ Функция
getaddrinfo
gethostbyname
getservbyname
■ Функция
getnameinfo
gethostbyaddr
getservbyport
Похожая проблема возникает с переменной
errno
close
■ поместить аргумент системного вызова (целочисленный дескриптор) в регистр;
■ поместить значение в другой регистр, указывая, что был сделан системный вызов функции
close
■ активизировать системный вызов (переключиться на ядро со специальной инструкцией);
■ проверить значение регистра, чтобы увидеть, что произошла ошибка;
■ если ошибки нет, возвратить (0);
■ сохранить значение какого-то другого регистра в переменной
errno
■ возвратить (-1).
Прежде всего заметим, что если ошибки не происходит, значение переменной
errno
Будем считать, что программа проверяет возвращаемое значение функции
close
errno
if (close(fd) < 0) {
fprintf(stderr, "close error, errno = $dn", errno);
exit(1);
}
Существует небольшой промежуток времени между сохранением кода ошибки в переменной errno в тот момент, когда системный вызов возвращает управление, и выводом этого значения программой. В течение этого промежутка другой программный поток внутри процесса (то есть обработчик сигналов) может изменить значение переменной
errno
close
fprintf
write
errno
close
write
При рассмотрении этих двух проблем в связи с обработчиками сигналов одним из решений проблемы с функцией
gethostbyname
errno
errno
void sig_alrm(int signo) {
int errno_save;
errno_save = errno; /* сохраняем значение этой переменной
при вхождении */