【问题标题】:How do I find the possible values for a constructor in the Perl core modules?如何在 Perl 核心模块中找到构造函数的可能值?
【发布时间】:2019-04-01 22:51:14
【问题描述】:

例如,在https://perldoc.perl.org/IO/Socket/INET.html,它将 SOCK_STREAM 和 SOCK_DGRAM 列为类型/套接字类型的两个可能值,然后是省略号(我假设这意味着有更多可能的值)。我如何找到这些其他值(或者这是一个错误的假设)?

例如,在 .NET 文档中,通常有某种 Enum,其中列出了可能的值及其含义:https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.updatepanelupdatemode?view=netframework-4.7.2

我似乎在 perldoc 网站上找不到任何这样的等价物,总的来说我感觉很迷茫。

【问题讨论】:

    标签: perl code-documentation


    【解决方案1】:

    IO::Socket::INET 只是为Socket 中的 subs 提供了一个更友好的界面。反过来,Socket 中的 subs 是 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) 标志。请参阅 open(2) 中对 O_CLOEXEC 标志的描述,了解这可能有用的原因。

    【讨论】:

    • 核心模块中的所有东西都是简单的包装器吗?或者只是这个?
    • POSIX,是的。尽管有这个名字,但里面的 subs 实际上只是底层系统的,不一定是 POSIX 兼容的版本。否则,什么都没有想到?
    【解决方案2】:

    IO::Socket::INET 文档中,它不一定完全显而易见,但它确实有一个“另见”部分,它同时指向SocketIO::Socket。在Socket 文档中定义了SOCK_STREAMSOCK_DGRAM。请注意,在 IO::Socket::INET 文档中,SOCK_STREAMSOCK_DGRAM 没有被引用。也就是说,它们不是字符串。这意味着它们在某处是常量,而某处位于Socket

    【讨论】:

    • 谢谢,但即使是 Socket 文档页面也只能达到 SOCK_RAW,然后才会变成省略号...
    【解决方案3】:

    对于这个特定的项目,您需要查看Socket,它定义了低级例程和常量。引用有关常量的文档:

    在以下每一组中,可能有更多的常数 提供的不仅仅是章节标题中作为示例给出的那些。 如果标题结束......那么这意味着可能有更多;这 提供的确切常量将取决于操作系统和在 编译时。

    我在 Mac 上的 Socket.pm 文件(我在 /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 包的路径。

    【讨论】:

    • 哇,这看起来……很痛苦。每个文件的路径是否记录在某处,还是您只需搜索文件名?
    • 没有理由调出调试模式。可以使用perl -le'use Socket; print $INC{"Socket.pm"};。也就是说,perldoc -lm Socket 是迄今为止最简单的!
    • 当然可以,但是学习一种新的做事方法并不是一个坏主意。
    猜你喜欢
    • 2021-05-03
    • 2018-04-15
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多