Как мне найти возможные значения для конструктора в модулях ядра Perl?

#perl #code-documentation

#perl #код-документация

Вопрос:

Например, в https://perldoc.perl.org/IO/Socket/INET.html в нем перечислены SOCK_STREAM и SOCK_DGRAM как два возможных значения для типа / типа сокета, за которыми следуют многоточия (которые, я полагаю, означают, что существует больше возможных значений). Как мне найти эти другие значения (или это ошибочное предположение)?

В .В NET docs, например, обычно есть какое-то перечисление, где перечислены возможные значения и их значения: https://learn.microsoft.com/en-us/dotnet/api/system.web.ui.updatepanelupdatemode?view=netframework-4.7.2

Кажется, я не могу найти какой-либо подобный эквивалент на сайте perldoc и в целом чувствую себя совершенно потерянным.

Ответ №1:

IO::Socket::INET просто предоставляет более удобный интерфейс для вспомогательных модулей в сокете. В свою очередь, вспомогательные модули в Socket являются простыми оболочками для функций C, макросов C и системных вызовов Unix с одинаковыми именами.

Вы можете получить системную документацию по ним со страниц руководства вашей системы. Для получения документации по конкретному вызову, о котором идет речь, вы можете использовать следующую команду:

 man 2 socket
  

В моей системе,

Сокет имеет указанное type , которое определяет семантику связи. В настоящее время определены следующие типы:

  • SOCK_STREAM

    Обеспечивает упорядоченные, надежные, двусторонние потоки байтов на основе соединения. Может поддерживаться механизм внеполосной передачи данных.

  • SOCK_DGRAM

    Поддерживает дейтаграммы (сообщения без установления соединения, ненадежные с фиксированной максимальной длиной).

  • SOCK_SEQPACKET

    Обеспечивает последовательный, надежный, основанный на двустороннем соединении путь передачи данных для дейтаграмм фиксированной максимальной длины; потребителю требуется считывать весь пакет при каждом системном вызове ввода.

  • SOCK_RAW

    Обеспечивает доступ к исходному сетевому протоколу.

  • SOCK_RDM

    Обеспечивает надежный уровень дейтаграмм, который не гарантирует упорядочение.

  • SOCK_PACKET

    Устарел и не должен использоваться в новых программах; см. Пакет (7).

Некоторые типы сокетов могут быть реализованы не во всех семействах протоколов; например, SOCK_SEQPACKET не реализовано для AF_INET .

Начиная с Linux 2.6.27, type аргумент служит второй цели: в дополнение к указанию типа сокета, он может включать побитовое ИЛИ любое из следующих значений, чтобы изменить поведение socket() :

  • SOCK_NONBLOCK

    Установите O_NONBLOCK флаг состояния файла в описании нового открытого файла. Использование этого флага экономит дополнительные вызовы fcntl(2) для достижения того же результата.

  • SOCK_CLOEXEC

    Установите флаг close-on-exec ( FD_CLOEXEC ) для нового файлового дескриптора. Смотрите описание O_CLOEXEC флага в open(2), чтобы узнать, почему это может быть полезно.

Комментарии:

1. Все ли элементы в модулях ядра являются простыми оболочками? Или только это в частности?

2. POSIX, да. Несмотря на название, вспомогательные модули внутри на самом деле являются просто базовой системой, не обязательно совместимой с POSIX версией. В противном случае ничего не приходит на ум?

Ответ №2:

В IO::Socket::INET документации это не обязательно полностью очевидно, но в нем есть раздел «См. также», который указывает на оба Socket и IO::Socket . Это в Socket документации, где определены SOCK_STREAM и SOCK_DGRAM . Обратите внимание, что в IO::Socket::INET документации SOCK_STREAM и SOCK_DGRAM не заключены в кавычки. То есть они не являются строками. Это подразумевает, что они где-то являются константами, и это где-то находится в Socket .

Комментарии:

1. Спасибо, но даже страница документа сокета доходит только до SOCK_RAW, прежде чем она завершится многоточием…

Ответ №3:

Для этого конкретного элемента вам нужно посмотреть на Socket , который определяет низкоуровневые процедуры и константы. Процитировать документы о константах:

В каждой из следующих групп может быть предоставлено гораздо больше констант, чем просто те, которые приведены в качестве примеров в заголовке раздела. Если заголовок заканчивается … то это означает, что их, вероятно, больше; точные предоставленные константы будут зависеть от операционной системы и заголовков, найденных во время компиляции.

Socket.pm Файл на моем Mac, который я нашел в /usr/local/lib/perl5/5.28.1/darwin-thread-multi-2level/Socket.pm , определяет следующие типы сокетов:

SOCK_DGRAM SOCK_RAW SOCK_RDM SOCK_SEQPACKET SOCK_STREAM

Остальные сетевые константы также присутствуют. Вероятно, вы захотите выполнить дальнейший поиск по этим именам, чтобы понять, для чего они предназначены.

Редактировать: Чтобы облегчить поиск пути к Socket.pm , используйте отладчик:

 box:~ $ perl -de0

Loading DB routines from perl5db.pl version 1.53
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

DB::DB(-e:1):   0
  DB<1> use Socket

  DB<2> p $INC{'Socket.pm'}
/usr/local/Cellar/perl/5.28.1/lib/perl5/5.28.1/darwin-thread-multi-2level/Socket.pm
  DB<3> q
box:~ $ 
  

Это выведет путь, по которому Perl загрузил Socket пакет.

Комментарии:

1. Вау, это кажется … болезненным. Задокументирован ли где-нибудь путь к каждому файлу или вам просто нужно выполнить поиск по имени файла?

2. Нет причин вызывать режим отладки. Можно было бы использовать perl -le'use Socket; print $INC{"Socket.pm"}; . Тем не менее, perldoc -lm Socket это самое простое на сегодняшний день!

3. Конечно, но изучение нового способа выполнения чего-либо — неплохая идея.