时钟同步软件ptp4l简介、安装、使用

摘自:

一、ptp4l简介

ptp4l 是 Linux 下的一个开源软件,是 IEEE 1588 Precision Time Protocol (PTP) 实现之一。它的功能是通过网络同步多个系统的时钟,并提供高精度的时间戳。下面分别解释其概念、实现功能、优缺点、应用场景。

概念:

PTP 是一种网络协议,用于在分布式系统中实现时钟同步。ptp4l (PTPv2 Linux implementation)是一个 PTP 协议的实现,支持 PTPv2 协议、时钟精度等级(clock precision)选择、延迟补偿等功能。其可以通过网络同步多个 PTP 节点的时钟,并提供高精度的时间戳。

实现功能:

ptp4l 常用于实现时钟同步和高精度时间戳,可以用于音视频同步、数据采集与处理、金融交易、电力系统同步、工业控制等领域。它提供以下主要功能:

  1. 实现时钟同步:ptp4l 可以通过协议同步多个节点的时钟,以达到高精度的时间同步。

  2. 提供高精度时间戳:ptp4l 可以为接收到的数据进行时间戳,并且提供子纳秒级别的时间精度。

  3. 支持不同精度等级:ptp4l 可以支持不同的时钟精度等级,以达到更高精度的时钟同步。

  4. 支持延迟补偿:ptp4l 可以诊断网络延迟,并根据延迟对时钟进行补偿。

优点:

  1. 高精度:ptp4l 提供子纳秒级别的时间精度,可满足对时间精度要求较高的场景。

  2. 可扩展性:ptp4l 可以通过协议同步多个节点的时钟,可以扩展到分布式系统中。

  3. 灵活性:ptp4l 可以通过配置不同的时钟精度等级、延迟补偿等参数,以适应不同的应用场景。

缺点:

  1. 受限于硬件支持:ptp4l 的时间同步精度受限于硬件支持,如果硬件不支持高精度时钟同步,则精度会受到限制。

  2. 依赖于网络:ptp4l 通过网络实现时钟同步,因此受网络延迟、带宽等因素的影响。

二、应用场景:

ptp4l 主要应用于需要高精度时钟同步的场景,如音视频同步、数据采集与处理、金融交易、电力系统同步、工业控制等领域。在这些场景中,需要对不同系统中的时钟进行同步,以达到高精度和一致性,从而保证系统的稳定性和正常运行。

 

以下是在 CentOS 7 上安装和使用 LinuxPTP 的简要步骤:

  1. 打开终端,使用以下命令安装 LinuxPTP:

    sudo yum install linuxptp
    

     

  2. 验证 LinuxPTP 是否已成功安装。在终端中输入以下命令:

    ptp4l -v
    

     

    如果显示 LinuxPTP 版本号,则表示安装成功。

  3. 配置 LinuxPTP。在终端中输入以下命令:

    sudo nano /etc/ptp4l.conf
    

     

    打开配置文件并根据需要进行更改。例如,您可以更改时钟设置、物理网络接口、PTP 网络接口等。

  4. 启动 LinuxPTP。在终端中输入以下命令: 

    复制代码
    [root@localhost ~]# ptp4l -i enp1s0 -f /etc/ptp4l.conf -m
     
    ptp4l[519569.670]: selected /dev/ptp0 as PTP clock
     
    ptp4l[519569.672]: port 1: INITIALIZING to LISTENING on INIT_COMPLETE
     
    ptp4l[519569.672]: port 0: INITIALIZING to LISTENING on INIT_COMPLETE
     
    ptp4l[519577.354]: port 1: LISTENING to MASTER on ANNOUNCE_RECEIPT_TIMEOUT_EXPIRES
     
    ptp4l[519577.354]: selected local clock 001b21.fffe.c4522a as best master
     
    ptp4l[519577.354]: assuming the grand master role
     
     
    复制代码

     

    这将启动 PTP 守护程序并将其配置为使用 eth0 接口,以 /etc/linuxptp/ptp4l.conf 中指定的设置运行。

  5. 检查时钟同步情况。在终端中输入以下命令: 

     

    复制代码
    [root@localhost ~]# phc2sys -s enp1s0 -w CLOCK_REALTIME -m
    phc2sys[519870.160]: CLOCK_REALTIME phc offset -172 s0 freq +44777 delay 749
    phc2sys[519871.161]: CLOCK_REALTIME phc offset -177 s2 freq +44772 delay 758
    phc2sys[519872.161]: CLOCK_REALTIME phc offset -173 s2 freq +44599 delay 758
    phc2sys[519873.161]: CLOCK_REALTIME phc offset -25 s2 freq +44695 delay 743
    phc2sys[519874.161]: CLOCK_REALTIME phc offset 44 s2 freq +44757 delay 745
    phc2sys[519875.161]: CLOCK_REALTIME phc offset 34 s2 freq +44760 delay 751
    phc2sys[519876.162]: CLOCK_REALTIME phc offset 61 s2 freq +44797 delay 745
    phc2sys[519877.162]: CLOCK_REALTIME phc offset 42355 s2 freq +87109 delay 749
    phc2sys[519878.162]: CLOCK_REALTIME phc offset 122 s2 freq +57583 delay 757
    phc2sys[519879.162]: CLOCK_REALTIME phc offset -12775 s2 freq +44722 delay 745
    phc2sys[519880.162]: CLOCK_REALTIME phc offset -12753 s2 freq +40912 delay 754
    phc2sys[519881.163]: CLOCK_REALTIME phc offset -8903 s2 freq +40936 delay 744
    复制代码

     

    这将将 PHC(Ptp Hardware Clock)与真实时钟同步,从而确保时钟同步。

以上是在 CentOS 7 上安装和使用 LinuxPTP 的基本步骤,实际上,您还需要了解更多关于 LinuxPTP 的详细配置和使用方法,以确保系统正常运行。

常用参数

ptp4l 常用参数含义如下:

复制代码
usage: ptp4l [OPTION]... [INTERFACE]...

ptp4l is an implementation of the Precision Time Protocol (PTP) according 
to IEEE standard 1588 for Linux. PTP is used to synchronize the clocks of
devices over a network. ptp4l, in conjunction with phc2sys, can be used to
synchronize the system clock to an external PTP clock.


OPTION list:

-C, --config-file load configuration from file
-g, --global-override enable global override of settings in configuration files
-i, --interface specify an interface to use
-m, --management enable the PTP management messages
-p, --priority select the priority1 and priority2 for PTP port
-s, --step-seconds step the clock if offset is greater than given seconds
-A, --announce-interval interval in seconds between sending announce messages
-D, --drift-threshold drift threshold for the clock in seconds per second (default 1e-6)
-G, --domain specify PTP domain number (default 0)
-H, --pdelay-req-hops number of hops for pdelay-req messages (default 1)
-I, --init-delay initial delay before sending first announce message (seconds)
-M, --max-adjustable-offset the maximum offset the clock can be adjusted in seconds
-O, --outlier-threshold specify outlier threshold for the clock discipline
-P, --phc2sys enable phc2sys compatibility mode
-Q, --ptpengine-debug output debug information for ptpengine (use multiple times for more detail)
-R, --hw-timestamps use hardware timestamps instead of software
-S, --src-addr specify source IPv4 or IPv6 address (receiver mode only)
-T, --unicast-address specify unicast destination address instead of multicast
-U, --user-description specify user description for PTP port
-V, --version print version number and exit
-W, --override-offset-allowed override the offset if the difference is outside acceptable limits (default false)
-X, --set-timeout specify timeout in milliseconds for message receptions
-Y, --sync-rate-limit limit the number of sync messages propagated per second
-Z, --pid-file write the PID of ptp4l to a file
-d, --debug-level output debugging information (use multiple times for more detail)
-f, --foreground stay in foreground and output messages to stdout
-h, --help display this help and exit
-l, --lock-file lock file used for PID file (default /var/run/ptp4l.lock)
-o, --one-step enable the one-step clock mode
-r, --priority1 specify PTP priority1 value (default 128)
-t, --priority2 specify PTP priority2 value (default 0)
-u, --unicast-dest specify unicast destination for PTP messages
-v, --verbose output verbose messages

See the ptp4l(8) man page for more information.
复制代码

 

 

其中一些常用的参数的使用方法如下:

  • -C, --config-file: 指定配置文件的位置,例如 -C /etc/ptp4l.conf
  • -i, --interface: 指定要使用的接口名称,例如 -i eth0
  • -m, --management: 启用 PTP 管理消息,例如 -m
  • -s, --step-seconds: 如果时钟偏移大于给定的秒数,则步进时钟,例如 -s 1
  • -A, --announce-interval: 指定发送 announce 消息的间隔时间,例如 -A 30
  • -M, --max-adjustable-offset: 指定时钟可以调整的最大偏移量,例如 -M 0.1
  • -Q, --ptpengine-debug: 输出 ptpengine 的调试信息。您可以使用多次 -Q 选项来获取更多的调试信息,例如 -Q -Q -Q
  • -d, --debug-level: 输出调试信息,使用多个 -d 选项可以获取更详细的调试信息,例如 -d -d -d
  • -f, --foreground: 以前台进程方式运行,将消息输出到标准输出中,例如 -f
  • -h, --help: 显示帮助信息,例如 -h
  • -v, --verbose: 打印详细的消息,例如 -v

这些参数的使用方法可以结合具体的应用场景来确定。

复制代码
[root@localhost ~]# ptp4l -h

usage: ptp4l [options]

 Delay Mechanism

 -A        Auto, starting with E2E
 -E        E2E, delay request-response (default)
 -P        P2P, peer delay mechanism

 Network Transport

 -2        IEEE 802.3
 -4        UDP IPV4 (default)
 -6        UDP IPV6

 Time Stamping

 -H        HARDWARE (default)
 -S        SOFTWARE
 -L        LEGACY HW

 Other Options

 -f [file] read configuration from 'file'
 -i [dev]  interface device to use, for example 'eth0'
           (may be specified multiple times)
 -p [dev]  PTP hardware clock device to use, default auto
           (ignored for SOFTWARE/LEGACY HW time stamping)
 -s        slave only mode (overrides configuration file)
 -t        transparent clock
 -l [num]  set the logging level to 'num'
 -m        print messages to stdout
 -q        do not print messages to the syslog
 -v        prints the software version and exits
 -h        prints this message and exits
复制代码

 

主时钟:# ptp4l -i enp95 -m -H -2

从时钟:# ptp4l -i enp49 -m -H -s -2

说明:

  • ptp4l -i enp95 -m -H -2:在网络接口 上使用硬件时间戳(-H),以以太网协议(-2)进行 PTP 同步,并将消息输出到标准输出(-m)。
  • ptp4l -i enp49 -m -H -s -2:在网络接口上使用硬件时间戳(-H),以以太网协议(-2)进行 PTP 同步,并且启用客户端同步模式(-s),同时将消息输出到标准输出(-m

同步精度在+/- 100ns以内

 

附:报错:failed to create a clock

ptp4l[519360.082]: interface 'enp4s0' does not support requested timestamping mode
failed to create a clock

这个错误通常出现在 Linux 系统上,表明 ptp4l 无法在指定的网络接口上启用 PTP 时间戳模式。可能的原因是:

  1. 网络接口不支持 PTP 时间戳模式。某些网络接口可能不支持硬件时间戳或软件时间戳,因此无法用于 PTP 同步。

  2. 没有足够的权限来启用 PTP 时间戳模式。在某些系统中,需要以管理员或特权用户身份运行 ptp4l,才能访问必要的系统资源。

为了解决这个问题,可以尝试以下步骤:

  1. 检查网络接口是否支持 PTP 时间戳模式。可以使用 ethtool 命令来查看网络接口是否支持硬件时间戳或软件时间戳。例如,使用以下命令查看 enp4s0 网络接口的时间戳能力:

    sudo ethtool -T enp4s0
    

     

    如果输出中包含 PTPv2(IEEE 1588),则表示该网络接口支持 PTP 时间戳模式。如果没有该选项,则表示网络接口不支持 PTP 时间戳模式。

  2. 确认当前用户是否具有足够的权限启用 PTP 时间戳模式。可以尝试使用 sudo 命令以管理员或特权用户身份运行 ptp4l。

  3. 如果确认网络接口支持 PTP 时间戳模式且当前用户具有足够的权限,但仍然遇到该错误,请尝试升级系统内核或驱动程序,以确保网络接口驱动程序支持 PTP 时间戳模式。

希望以上步骤可以帮助您解决这个问题。

接口不支持PTP时间戳模式:

 接口支持PTP时间戳模式:

 

IEEE 1588

IEEE 1588,通常被称为 精确时间协议(PTP, Precision Time Protocol),是由 IEEE 1588标准规定的一种网络时间同步协议。它旨在通过以太网等网络为基础,在计算机和通信设备中实现高精度的时间同步。IEEE 1588可以在局域网(LAN)中,甚至是广域网(WAN)中提供高精度的时钟同步,尤其是在那些需要精确时间同步的应用场景中。

IEEE 1588的主要特点

  1. 高精度时钟同步: IEEE 1588协议能够实现微秒甚至纳秒级别的时钟同步,具体精度取决于网络的质量、硬件支持以及配置等因素。与传统的基于网络的时钟同步方法(如NTP)相比,IEEE 1588提供了更高的时间同步精度。

  2. 主从结构: IEEE 1588采用主从模式来进行时间同步。网络中的一个设备被指定为主时钟(Grandmaster Clock),其他设备作为从时钟(Slave Clocks)进行同步。主时钟提供精确的时间信息,从时钟则根据主时钟的时间调整自身的时钟。

  3. 时钟同步算法: IEEE 1588采用了基于交换时间戳的算法来实现高精度的时钟同步。交换的时间戳通常包括:

    • Sync消息:主时钟向从时钟发送同步消息,通知从时钟当前的时间。
    • Follow_Up消息:主时钟如果无法在同步消息中提供精确的发送时间,会单独发送跟进消息来补充发送时间戳。
    • Delay_Req消息:从时钟向主时钟发送请求,测量往返时延。
    • Delay_Resp消息:主时钟回应从时钟的延迟请求。
  4. 网络延迟补偿: 在传统的时钟同步方法中,网络延迟常常会影响同步精度。而IEEE 1588协议通过测量消息在网络中传播的时间,能在时钟同步过程中进行网络延迟的补偿。通过交换多个时间戳,协议能精确估算出延迟,并且对其进行校正。

  5. 层级结构与多层时钟同步: IEEE 1588协议支持多层次的时钟同步结构。比如,一个网络中可以有多个从时钟,而这些从时钟可以进一步成为其他从时钟的主时钟,从而实现多级的精确时间同步。

IEEE 1588标准的版本

  • IEEE 1588-2002(PTP v1):这是最早的版本,主要解决了局域网内的时间同步问题。它规定了精确时间同步的基本框架,但对网络延迟的补偿和精度的提升有一定的限制。

  • IEEE 1588-2008(PTP v2):这是改进后的版本,对原有协议进行了优化,加入了更多的特性,如:

    • 精确的时间戳算法
    • 支持更多的时钟类型(如Boundary Clocks、Transparent Clocks)
    • 支持多层次的时钟同步和更高的网络延迟补偿机制
    • 提供更好的容错性和稳定性

IEEE 1588的应用

IEEE 1588的高精度时钟同步特性使其在许多领域中得到了广泛应用,特别是在那些要求精确时间同步的工业、科研和商业场景中。常见的应用包括:

  1. 工业自动化与控制系统: 在一些分布式控制系统中,多个控制设备需要在微秒级别同步时间,以确保它们的协同工作。例如,机器人控制、生产线的自动化控制等。

  2. 通信系统: 在移动通信、光纤网络、5G网络等领域,IEEE 1588用于确保基站之间和网络设备之间的时间同步,以支持数据传输的时延控制、流量管理和协调。

  3. 电力系统: 在电力网络中,特别是智能电网中,精确的时间同步对于保护设备的协调性、故障检测以及事件的记录至关重要。

  4. 金融系统: 在金融交易系统中,时间的精确同步对于确保交易的准确记录、执行顺序以及合规性至关重要。IEEE 1588被用于高频交易、交易时钟的同步等场景。

  5. 音视频同步: 在音视频流的传输中,尤其是在广播和直播领域,IEEE 1588被用来保持音视频数据流的精确同步,避免因时差导致音视频不同步的问题。

设备支持与硬件加速

为了达到纳秒级别的时间同步精度,IEEE 1588协议通常需要专门的硬件支持。许多网络设备和芯片(如交换机、网卡、路由器等)支持IEEE 1588协议的硬件加速。通过硬件时间戳、精确的时钟同步机制和延迟补偿技术,能够大大提高同步精度,减少由软件引入的误差。

报文流程图

报文说明

在 精密时间协议(PTP,IEEE 1588) 中,通信过程中使用不同类型的报文来同步主时钟和从时钟。每种报文类型都有其特定的功能和作用。以下是 PTP 报文的类型、说明以及作用的表格:

报文类型说明作用
Sync 主时钟发送的同步报文,包含主时钟的当前时间戳。 从时钟通过此报文获取主时钟的时间戳,并根据收到的同步信息来校正自己的时钟。
Follow_Up 仅在 2-step 模式下使用,主时钟发送的跟随报文,提供 Sync 报文中时间戳的精确值。 用于修正由于传输延迟引起的 Sync 报文时间戳误差。它提供了主时钟发出 Sync 报文时的准确时间戳,使从时钟能够准确同步。
Delay_Req 从时钟发送的延迟请求报文,用于测量从时钟到主时钟的单程延迟。 通过请求报文,向主时钟询问从时钟与主时钟之间的网络延迟。该报文是同步过程的一部分,帮助从时钟计算与主时钟的时钟偏差。
Delay_Resp 主时钟响应从时钟的延迟请求报文,包含主时钟的时间戳。 主时钟返回此报文以告知从时钟延迟请求的时间。通过该报文,从时钟可以计算出从时钟到主时钟的单程延迟,从而补偿网络传输延迟。
PDelay_Req 使用于点对点(peer-to-peer)通信的延迟请求报文。 点对点网络中的设备通过此报文交换时间戳来测量延迟,帮助两个设备测量彼此之间的延迟并进行时钟同步。
PDelay_Resp 点对点通信中的延迟请求响应报文,回应 PDelay_Req 报文,包含发送此报文的设备的时间戳。 在点对点的时钟同步过程中,响应对方的延迟请求报文,帮助计算从时钟到主时钟的单程延迟。
PDelay_Resp_Follow_Up 点对点模式中的跟随报文,提供 PDelay_Resp 报文的精确时间戳。 该报文修正 PDelay_Resp 报文中的时间戳误差,用于高精度时钟同步。
Announce 用于广播或多播的报文,包含主时钟的身份信息、优先级等。 用于在网络中宣布主时钟的存在,允许从时钟选择最佳主时钟来进行同步。
Sync_Follow_Up 用于支持主时钟与从时钟之间精确同步的补充报文,仅在某些高精度模式中使用。 提供与 Sync 报文相关的更多同步信息,用于进一步修正时间戳误差。
Management 用于管理和配置 PTP 网络的报文,允许修改协议参数、查询状态等。 用于设备间配置 PTP 设置或获取网络状态信息,支持网络管理和调试。
Signaling 用于 PTP 网络中设备之间的控制和信令通信,传递状态信息或警告。 用于设备间传递控制信号或状态更新信息,帮助管理和调节 PTP 网络的运行状态。

主要报文类型的作用

  • Sync 和 Follow_Up:这两个报文是 PTP 中时钟同步的核心报文,通过它们主时钟和从时钟共享时间信息。
  • Delay_Req 和 Delay_Resp:用于测量和补偿网络延迟,以保证精确同步。通过这两类报文,系统可以计算出单程延迟并调整时钟。
  • Announce:用于主时钟的广播,使得从时钟能够选择最优的主时钟进行同步,尤其是在多主时钟环境下非常有用。
  • PDelay_Req 和 PDelay_Resp:用于点对点同步,尤其是在网络拓扑结构为点对点的情况下。

1-step 模式与 2-step 模式的区别:

  1. 1-Step 模式:

    • 在 1-step 模式 中,Sync 报文直接携带主时钟的时间戳。同步操作只需要一次消息传递,即主时钟直接发送 Sync 报文给从时钟,且时间戳信息在同一报文内传送。
    • 优点:同步过程简化,降低了延迟和网络带宽需求。
    • 缺点:由于时间戳是在 Sync 报文中传递,可能会存在更高的时钟漂移或误差,需要更高精度的时钟硬件支持。
  2. 2-Step 模式:

    • 在 2-step 模式 中,Sync 报文不包含时间戳,主时钟首先发送 Sync 报文,然后通过单独的 Follow_Up 报文来传递准确的时间戳。这样能够更精确地控制时间戳的传输。
    • 优点:由于时间戳是在 Follow_Up 报文中传递,它能够提供更高的精度和准确性,尤其适合精密时钟同步。
    • 缺点:同步过程需要两次消息传递,因此网络延迟和带宽使用量可能会增加。

 

 

OC(Ordinary Clock)、BC(Boundary Clock) 和 TC透明时钟(Transparent Clock) 三种时钟模式的对比说明:

时钟模式对比表

时钟模式功能描述优点缺点应用场景
OC(普通时钟,Ordinary Clock) 设备通过接收来自主时钟的同步信号(Sync 报文),调整自己的本地时钟。它在网络中充当从时钟角色。 - 配置简单,易于实现。<br> - 无需额外的硬件,只需要一个普通的时钟源即可。 - 需要依赖主时钟进行同步。<br> - 可能受到传输延迟的影响,导致同步误差。 - 在简单的网络结构中使用,通常作为从时钟。
BC(边界时钟,Boundary Clock) 边界时钟不仅可以同步主时钟,还可以作为网络中的中介设备,为其他设备提供时间信号。它通过接收主时钟的同步信号并发送同步信号给其他设备。 - 能够消除网络中的时钟同步误差,提供多路径同步。<br> - 支持多个子网络的时间同步。 - 需要更多的硬件和配置。<br> - 增加网络中的复杂性和成本。 - 在复杂网络或具有多个子网的环境中使用。
透明时钟(Transparent Clock) 透明时钟不会提供时间同步,它通过修正同步报文在网络中的延迟,帮助提高网络同步精度。 - 提高时间同步精度,减少延迟误差。<br> - 不需要参与时钟同步过程,简化了时钟同步架构。 - 不能独立进行时钟同步,仅用于延迟补偿。<br> - 需要精确测量网络延迟,增加复杂性。 - 在高性能网络(如数据中心)或需要低延迟同步的环境中使用。

详细说明

  1. OC(普通时钟,Ordinary Clock):

    • 功能:普通时钟(OC)通常是一个设备,它从网络中的主时钟接收同步信号并调整自己的时钟。这种模式下的设备充当从时钟角色,依赖于主时钟来同步自己的时间。
    • 优点:配置简单,适用于小型网络和简单的同步需求。因为它不涉及复杂的硬件或额外的计算,所以成本较低。
    • 缺点:由于是从时钟设备,它必须依赖主时钟进行同步,因此一旦主时钟出现故障,整个同步链条就会受到影响。还可能受到网络延迟的影响,导致时钟同步误差。
  2. BC(边界时钟,Boundary Clock):

    • 功能:边界时钟(BC)在网络中充当桥梁角色,能够接收来自上游主时钟的同步信号,并作为下游网络的时钟源,向其他设备提供时间同步服务。它可以在网络中消除时钟漂移和延迟。
    • 优点:边界时钟能够处理网络中的多个路径和多个子网,使得大型复杂网络中的时间同步更加可靠。它支持多层次的同步,有助于在大型网络中确保时间的准确性。
    • 缺点:与普通时钟相比,边界时钟的实现更为复杂,需要更多的硬件支持和配置。增加了网络的复杂性和成本。
  3. 透明时钟(Transparent Clock):

    • 功能:透明时钟不参与时钟同步本身,而是在传输时间同步报文时,修正网络中的延迟,以提高时钟同步的精度。透明时钟通常位于网络的转发路径中,负责测量并补偿报文传输过程中的延迟。
    • 优点:透明时钟通过减少延迟误差,能够显著提高同步精度。它不直接参与时钟同步,简化了时钟同步架构。适用于需要低延迟和高精度同步的网络环境。
    • 缺点:透明时钟只能对网络中的延迟进行补偿,不能作为同步源本身,因此不能独立提供时间同步。它的实现较为复杂,需要精确测量和校准延迟。
posted @   LiuYanYGZ  阅读(296)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2020-01-09 Python语法糖系列
2020-01-09 腾讯、阿里DNS地址
2020-01-09 python带有通用参数的通用装饰器
2020-01-09 python带参数的类装饰器
2019-01-09 c linux ping 实现
点击右上角即可分享
微信分享提示