Используя встроенную команду time, измерьте время выполнения второй программы при N, равном 0, 10 000, 20 000, 30 000 и 40 000. Соответствуют ли результаты ожидаемому линейному поведению?
51.6. Поэкспериментируйте с программой из листинга 51.2 (i_fcntl_locking.c), чтобы проверить утверждения, сделанные в подразделе 51.3.6 относительно зависания блокировок и приоритета блокировки записей вызовом fcntl().
51.7. Если у вас есть доступ к другим реализациям UNIX, задействуйте программу из листинга 51.2 (i_fcntl_locking.c). Проверьте, сможете ли определить правила блокировки записей вызовом fcntl(), касающиеся блокировки записывающих процессов и порядка, в котором удовлетворяются множественные запросы на получение блокировок.
51.8. Используйте программу из листинга 51.2 (i_fcntl_locking.c) для демонстрации того, что ядро обнаруживает циклическую взаимную блокировку на основе трех (или более) процессов, блокирующих один и тот же файл.
51.9. Напишите две программы (или одну, применяющую дочерний процесс), чтобы воспроизвести сценарий взаимной блокировки с помощью строгих блокировок, описанных в разделе 51.4.
51.10. Прочитайте справочную страницу утилиты lockfile(1), которая поставляется вместе с приложением procmail. Напишите ее упрощенную версию.
52. Сокеты: введение
Сокеты — это механизм межпроцессного взаимодействия, который позволяет обмениваться данными между приложениями, выполняемыми как локально, так и на разных компьютерах, соединенных по сети. Первая широко распространенная реализация программного интерфейса сокетов появилась в 4.2BSD в 1983 году и с тех пор была перенесена практически во все UNIX-системы и большинство систем других семейств.
Программный интерфейс сокетов формально описан в стандарте POSIX.1g, который был утвержден в 2000 году после примерно десяти лет рассмотрения. Позже ему на смену пришла спецификация SUSv3.
Эта и следующие главы описывают различные аспекты использования сокетов.
• Данная глава представит общие принципы программного интерфейса сокетов — фундамент, который вам потребуется при чтении остального материала. Здесь вы не найдете никаких примеров кода. Практические аспекты применения сокетов в UNIX- и интернет-доменах будут представлены позже.
• Глава 53 посвящена сокетам домена UNIX, позволяющим взаимодействовать приложениям в рамках одной системы.
• Глава 54 познакомит с различными концепциями компьютерных сетей и ключевыми возможностями сетевых протоколов TCP/IP. Применение этим знаниям вы найдете в следующих главах.
• Глава 55 описывает сокеты интернет-доменов, которые позволяют приложениям, находящимся на разных компьютерах, взаимодействовать по сети TCP/IP.
• В главе 56 мы обсудим архитектуру серверов, использующих сокеты.
• Глава 57 охватывает различные продвинутые темы, включая дополнительные возможности ввода/вывода сокетов, более подробный взгляд на протокол TCP и применение параметров сокета для получения и изменения его атрибутов.
Все указанные главы нацелены на то, чтобы помочь читателю хорошо подготовиться к работе с сокетами. Данная тема (особенно сетевое взаимодействие) сама по себе является огромным разделом в программировании, которому посвящены целые книги. Источники информации для дальнейшего изучения сокетов перечислены в разделе 55.15.
При использовании клиент-серверной архитектуры взаимодействие клиентов с помощью сокетов происходит следующим образом:
• каждое приложение создает сокет — «устройство», позволяющее им общаться друг с другом. Каждая из сторон должна иметь собственный сокет;
• сервер привязывает свой сокет к общеизвестному адресу (имени), чтобы клиенты могли его найти.
Сокет создается с применением системного вызова socket(); вся дальнейшая работа с сокетом выполняется с помощью дескриптора, возвращенного этим вызовом:
fd = socket(domain, type, protocol);
В следующих подразделах мы рассмотрим сокеты доменов и их виды. Во всех приложениях, которые приводятся в данной книге, аргумент protocol всегда равен 0.
Сокеты существуют внутри домена взаимодействия, определяющего:
• способ идентификации сокета (то есть формат его «адреса»);
• диапазон взаимодействия (то есть находятся ли приложения в одной системе или на разных компьютерах, соединенных по сети).
Современные операционные системы поддерживают как минимум домены следующих видов:
• UNIX-домен (AF_UNIX) позволяет взаимодействовать приложениям, находящимся на одном компьютере (в спецификации POSIX.1g синонимом AF_UNIX является константа AF_LOCAL, хотя в стандарте SUSv3 она не предусмотрена);
• IPv4-домен (AF_INET) позволяет взаимодействовать приложениям, которые выполняются на разных компьютерах, соединенных по сети на основе протокола IPv4 (Internet Protocol version 4);