码迷,mamicode.com
首页 > 其他好文 > 详细

pstree和ss命令详解

时间:2019-04-03 12:14:11      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:wrapper   keepalive   show   console   type   explicit   read   war   查看进程   

pstree查看进程树

将所有进程以树状形式显示,表示进程间的关系
以init进程(PID为1)为根或者指定PID的进程为根
init进程,它是内核启动的第一个用户级进程

pstree -V查看版本,这里介绍22.15

root@ubuntusvn:~# pstree -V
pstree (PSmisc) 22.15
版权所有 (C) 1993-2009 Werner Almesberger 和 Craig Small

PSmisc 无任何保证。
该程序为自由软件,欢迎你在 GNU 通用公共许可证(GPL) 下重新发布。
详情可参阅 COPYING 文件。

相同进程或线程合并显示,进程名前有相同进程的数量,只显示进程名,进程的子线程用大括号{}表示

root@ubuntusvn:~# pstree 
init─┬─acpid
     ├─atd
     ├─cron
     ├─dbus-daemon
     ├─6*[getty]
     ├─httpd───10*[httpd]
     ├─irqbalance
     ├─mysqld───149*[{mysqld}]
     ├─nginx───6*[nginx]
     ├─php5-fpm───5*[php5-fpm]
     ├─rsyslogd───3*[{rsyslogd}]
     ├─snmpd
     ├─sshd───sshd───bash───pstree
     ├─su───java───66*[{java}]
     ├─udevd───2*[udevd]
     ├─upstart-socket-
     ├─upstart-udev-br
     ├─vim
     ├─vsftpd
     ├─whoopsie───{whoopsie}
     └─wrapper-linux-x─┬─java───56*[{java}]
                       └─{wrapper-linux-x}

pstree -n 按进程号排序

root@ubuntusvn:~# pstree -n
init─┬─upstart-udev-br
     ├─udevd───2*[udevd]
     ├─vsftpd
     ├─upstart-socket-
     ├─sshd───sshd─┬─bash
     │             └─bash───pstree
     ├─rsyslogd───3*[{rsyslogd}]
     ├─dbus-daemon
     ├─6*[getty]
     ├─cron
     ├─atd
     ├─acpid
     ├─irqbalance
     ├─whoopsie───{whoopsie}
     ├─wrapper-linux-x─┬─{wrapper-linux-x}
     │                 └─java───56*[{java}]
     ├─httpd───10*[httpd]
     ├─mysqld───76*[{mysqld}]
     ├─su───java───66*[{java}]
     ├─php5-fpm───5*[php5-fpm]
     ├─snmpd
     ├─vim
     └─nginx───6*[nginx]

pstree -p显示进程及其子线程,并且显示PID
pstree -c显示进程及其子线程,与pstree -p相同,只是不显示PID

root@ubuntusvn:~# pstree -p
init(1)─┬─acpid(1040)
        ├─atd(1039)
        ├─cron(1038)
        ├─dbus-daemon(968)
        ├─getty(1021)
        ├─getty(1027)
        ├─getty(1031)
        ├─getty(1032)
        ├─getty(1035)
        ├─getty(2519)
        ├─httpd(1635)─┬─httpd(980)
        │             ├─httpd(2443)
        │             ├─httpd(2736)
        │             ├─httpd(3571)
        │             ├─httpd(3804)
        │             ├─httpd(5208)
        │             ├─httpd(5223)
        │             ├─httpd(5334)
        │             ├─httpd(30936)
        │             └─httpd(31365)
        ├─irqbalance(1140)
        ├─mysqld(2229)─┬─{mysqld}(2241)
        │              ├─{mysqld}(2242)
        │              ├─{mysqld}(2243)
        │              ├─{mysqld}(2244)
        │              ├─{mysqld}(2245)
        │              ├─{mysqld}(2246)
        │              ├─{mysqld}(2247)
        │              ├─{mysqld}(2248)
        │              ├─{mysqld}(2249)
        │              ├─{mysqld}(2250)
        │              ├─{mysqld}(2252)
        │              ├─{mysqld}(2253)
        │              ├─{mysqld}(2254)
        │              ├─{mysqld}(2255)
        │              ├─{mysqld}(2264)
        │              ├─{mysqld}(9669)
        │              ├─{mysqld}(11878)
        │              ├─{mysqld}(11881)
        │              ├─{mysqld}(11905)
        │              ├─{mysqld}(11907)
        │              ├─{mysqld}(11909)
        │              ├─{mysqld}(11910)
........

pstree -p [PID] 以指定PID的进程为根,显示进程名和进程号

root@ubuntusvn:~# pstree -p 30395
nginx(30395)─┬─nginx(30396)
             ├─nginx(30397)
             ├─nginx(30398)
             ├─nginx(30399)
             ├─nginx(30400)
             └─nginx(30401)

pstree -u显示进程所属用户名

root@ubuntusvn:~# pstree -u
init─┬─acpid
     ├─atd(daemon)
     ├─cron
     ├─dbus-daemon(messagebus)
     ├─6*[getty]
     ├─httpd(svnuser)───10*[httpd]
     ├─irqbalance
     ├─mysqld(mysql)───71*[{mysqld}]
     ├─nginx───6*[nginx(nginx)]
     ├─php5-fpm───5*[php5-fpm(www-data)]
     ├─rsyslogd(syslog)───3*[{rsyslogd}]
     ├─snmpd(snmp)
     ├─sshd───sshd───bash───pstree
     ├─su(artifactory)───java───66*[{java}]
     ├─udevd───2*[udevd]
     ├─upstart-socket-
     ├─upstart-udev-br
     ├─vim
     ├─vsftpd
     ├─whoopsie(whoopsie)───{whoopsie}
     └─wrapper-linux-x(svnuser)─┬─java───56*[{java}]
                                └─{wrapper-linux-x}

pstree -a 显示每个程序的完整指令,包含路径,可能显示不全,配合-l才完整显示

root@ubuntusvn:~# pstree -a
init    
  ├─acpid -c /etc/acpi/events -s /var/run/acpid.socket
  ├─atd
  ├─cron
  ├─dbus-daemon --system --fork --activation=upstart
  ├─getty -8 38400 tty4
  ├─getty -8 38400 tty5
  ├─getty -8 38400 tty2
  ├─getty -8 38400 tty3
  ├─getty -8 38400 tty6
  ├─getty -8 38400 tty1
  ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   └─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  ├─irqbalance
  ├─mysqld
  │   └─96*[{mysqld}]
  ├─nginx
  │   ├─nginx                   
  │   ├─nginx                   
  │   ├─nginx                   
  │   ├─nginx                   
  │   ├─nginx                   
  │   └─nginx                   
  ├─php5-fpm      
  │   ├─php5-fpm                                         
  │   ├─php5-fpm                                         
  │   ├─php5-fpm                                         
  │   ├─php5-fpm                                         
  │   └─php5-fpm                                         
  ├─rsyslogd -c5
  │   └─3*[{rsyslogd}]
  ├─snmpd -Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
  ├─sshd -D
  │   └─sshd    
  │       └─bash
  │           └─pstree -a
  ├─su - artifactory --shell=/bin/sh -c exec /tar/artifactory-2.5.1.1/bin/artifactory.init /tar/artifactory-2.5.1.1/etc/jetty.xml >>/tar/artifactory-2.5.1.1/logs/consoleout.log 2>&1
  │   └─java -server -Xms1g -Xmx1g -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M -XX:MaxPermSize=128M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31-XX:+Use
  │       └─66*[{java}]
  ├─udevd --daemon
  │   ├─udevd --daemon
  │   └─udevd --daemon
  ├─upstart-socket- --daemon
  ├─upstart-udev-br --daemon
  ├─vim erp.conf.sav
  ├─vsftpd
  ├─whoopsie
  │   └─{whoopsie}
  └─wrapper-linux-x /opt/csvn/bin/../data/conf/csvn-wrapper.conf wrapper.syslog.ident=csvn wrapper.pidfile=/opt/csvn/bin/../data/run/csvn.pid wrapper.name=csvnwrapper.displayname
      ├─java -XX:MaxPermSize=128m -Djetty.home=../appserver -Djetty.port=3343 -Djetty.ssl.port=4434 -Xms64m -Xmx512m -Djava.library.path=../lib -classpath ../lib/wrapper.jar-Dwrapper
      │   └─56*[{java}]
      └─{wrapper-linux-x}

pstree -l 不截断长行,一般与-a连用,显示完整的命令路径

root@ubuntusvn:~# pstree -al
init
  ├─acpid -c /etc/acpi/events -s /var/run/acpid.socket
  ├─atd
  ├─cron
  ├─dbus-daemon --system --fork --activation=upstart
  ├─getty -8 38400 tty4
  ├─getty -8 38400 tty5
  ├─getty -8 38400 tty2
  ├─getty -8 38400 tty3
  ├─getty -8 38400 tty6
  ├─getty -8 38400 tty1
  ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   ├─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  │   └─httpd -f /opt/csvn/data/conf/httpd.conf -k graceful
  ├─irqbalance
  ├─mysqld
  │   └─76*[{mysqld}]
  ├─nginx
  │   ├─nginx                   
  │   ├─nginx                   
  │   ├─nginx                   
  │   ├─nginx                   
  │   ├─nginx                   
  │   └─nginx                   
  ├─php5-fpm      
  │   ├─php5-fpm                                         
  │   ├─php5-fpm                                         
  │   ├─php5-fpm                                         
  │   ├─php5-fpm                                         
  │   └─php5-fpm                                         
  ├─rsyslogd -c5
  │   └─3*[{rsyslogd}]
  ├─snmpd -Lsd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
  ├─sshd -D
  │   └─sshd
  │       ├─bash
  │       └─bash
  │           └─pstree -al
  ├─su - artifactory --shell=/bin/sh -c exec /tar/artifactory-2.5.1.1/bin/artifactory.init /tar/artifactory-2.5.1.1/etc/jetty.xml >>/tar/artifactory-2.5.1.1/logs/consoleout.log 2>&1
  │   └─java -server -Xms1g -Xmx1g -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M -XX:MaxPermSize=128M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Djava.awt.headless=true -XX:NewSize=512m -XX:MaxNewSize=512m -XX:-UseConcMarkSweepGC -XX:+UseParNewGC -server -Djetty.home=/tar/artifactory-2.5.1.1 -Dartifactory.home=/tar/artifactory-2.5.1.1 -Dfile.encoding=UTF8 -cp /tar/artifactory-2.5.1.1/artifactory.jar:/tar/artifactory-2.5.1.1/lib/jetty-ajp-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-continuation-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-http-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-io-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-security-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-server-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-servlet-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-util-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-webapp-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/jetty-xml-7.0.2.v20100331.jar:/tar/artifactory-2.5.1.1/lib/servlet-api-2.5.jar:/tar/artifactory-2.5.1.1/lib/wrapper.jar org.artifactory.standalone.main.Main /tar/artifactory-2.5.1.1/etc/jetty.xml
  │       └─66*[{java}]
  ├─udevd --daemon
  │   ├─udevd --daemon
  │   └─udevd --daemon
  ├─upstart-socket- --daemon
  ├─upstart-udev-br --daemon
  ├─vim erp.conf.sav
  ├─vsftpd
  ├─whoopsie
  │   └─{whoopsie}
  └─wrapper-linux-x /opt/csvn/bin/../data/conf/csvn-wrapper.conf wrapper.syslog.ident=csvn wrapper.pidfile=/opt/csvn/bin/../data/run/csvn.pid wrapper.name=csvn wrapper.displayname=CSVN Console wrapper.daemonize=TRUE wrapper.statusfile=/opt/csvn/bin/../data/run/csvn.status wrapper.java.statusfile=/opt/csvn/bin/../data/run/csvn.java.status
      ├─java -XX:MaxPermSize=128m -Djetty.home=../appserver -Djetty.port=3343 -Djetty.ssl.port=4434 -Xms64m -Xmx512m -Djava.library.path=../lib -classpath ../lib/wrapper.jar -Dwrapper.key=fbjCafq7XJRD2XTW -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.disable_console_input=TRUE -Dwrapper.pid=1295 -Dwrapper.version=3.4.1 -Dwrapper.native_library=wrapper -Dwrapper.service=TRUE -Dwrapper.cpu.timeout=10 -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperJarApp ../appserver/start.jar
      │   └─56*[{java}]
      └─{wrapper-linux-x}

pstree -A 用 ASCII 画线符

root@ubuntusvn:~# pstree -A
init-+-acpid
     |-atd
     |-cron
     |-dbus-daemon
     |-6*[getty]
     |-httpd---10*[httpd]
     |-irqbalance
     |-mysqld---86*[{mysqld}]
     |-nginx---6*[nginx]
     |-php5-fpm---5*[php5-fpm]
     |-rsyslogd---3*[{rsyslogd}]
     |-snmpd
     |-sshd---sshd---bash---pstree
     |-su---java---66*[{java}]
     |-udevd---2*[udevd]
     |-upstart-socket-
     |-upstart-udev-br
     |-vim
     |-vsftpd
     |-whoopsie---{whoopsie}
     `-wrapper-linux-x-+-java---56*[{java}]
                       `-{wrapper-linux-x}

pstree -h 高亮显示当前正在使用的进程
技术图片

pstree -H [PID] 高亮显示 "进程号" 指定的进程及其父进程
技术图片

pstree -s [PID] 显示所选进程的父级进程

root@ubuntusvn:~# pstree -s 5707
init───su───java───{java}

pstree -G 使用 VT100 划线符
pstree -U 使用 UTF-8 (Unicode) 划线符

ss获取socket统计信息

它可以显示和netstat类似的内容。能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。
当服务器的socket连接数量变得非常大时,无论是使用netstat命令还是直接cat /proc/net/tcp,执行速度都会很慢。
ss快的秘诀在于,它利用到了TCP协议栈中tcp_diag。tcp_diag是一个用于分析统计的模块,可以获得Linux 内核中第一手的信息,这就确保了ss的快捷高效。

ss -h ss的使用帮助

root@ubuntusvn:~# ss -h
Usage: ss [ OPTIONS ]
       ss [ OPTIONS ] [ FILTER ]
   -h, --help           this message
   -V, --version        output version information
   -n, --numeric        don‘t resolve service names
   -r, --resolve       resolve host names
   -a, --all            display all sockets
   -l, --listening      display listening sockets
   -o, --options       show timer information
   -e, --extended      show detailed socket information
   -m, --memory        show socket memory usage
   -p, --processes      show process using socket
   -i, --info           show internal TCP information
   -s, --summary        show socket usage summary

   -4, --ipv4          display only IP version 4 sockets
   -6, --ipv6          display only IP version 6 sockets
   -0, --packet display PACKET sockets
   -t, --tcp            display only TCP sockets
   -u, --udp            display only UDP sockets
   -d, --dccp           display only DCCP sockets
   -w, --raw            display only RAW sockets
   -x, --unix           display only Unix domain sockets
   -f, --family=FAMILY display sockets of type FAMILY

   -A, --query=QUERY, --socket=QUERY
       QUERY := {all|inet|tcp|udp|raw|unix|packet|netlink}[,QUERY]

   -D, --diag=FILE     Dump raw information about TCP sockets to FILE
   -F, --filter=FILE   read filter information from FILE
       FILTER := [ state TCP-STATE ] [ EXPRESSION ]

ss -V ss版本

root@ubuntusvn:~# ss -V
ss utility, iproute2-ss111117

ss -n 不解析服务名称,显示服务对应的端口号,比如mysql:3306;https:443;ssh:22。Ss命令直接显示服务名称

[root@localhost ~]# ss
状态    接收队列  发送队列    本地地址:端口号           对等地址:端口号
State      Recv-Q        Send-Q      Local Address:Port           Peer Address:Port
ESTAB      0         0           192.168.1.191:https          192.168.5.89:58426
......
[root@localhost ~]# ss -n
State      Recv-Q        Send-Q      Local Address:Port           Peer Address:Port
ESTAB      0         0           192.168.1.191:443           192.168.5.89:58426
......

ss -r 解析主机名

root@ubuntusvn:~# ss -r
State      Recv-Q   Send-Q     Local Address:Port       Peer Address:Port   
ESTAB      0         0          ubuntusvn:https        192.168.5.89:58426
......

ss -l 统计处于监听状态的socket,默认情况下它们是被忽略的

root@ubuntusvn:~# ss -l
State      Recv-Q   Send-Q    Local Address:Port     Peer Address:Port   
LISTEN     0            50        *:3306                    *:*       
LISTEN     0            50        :::3343                   :::*       
LISTEN     0        511       *:http                    *:*       
LISTEN     0            100       :::4434                   :::*       
LISTEN     0        511       *:9876                    *:*       
LISTEN     0        32        *:ftp                 *:*       
LISTEN     0        128       :::ssh                    :::*       
LISTEN     0        128       *:ssh                 *:*       
LISTEN     0        511       *:https                   *:*       
LISTEN     0        511       *:4444                    *:*       
LISTEN     0        1         127.0.0.1:32000           *:*       
LISTEN     0        50        *:8001                    *:*       
LISTEN     0        511       *:9990                    *:*       
LISTEN     0        128       127.0.0.1:9000            *:*       
LISTEN     0        511       *:8008                    *:* 

ss -a 显示所有状态的socket(ESTAB、CLOSE-WAIT、TIME-WAIT、LISTEN等)

ss -o 显示计时器信息,keepalive默认为120min,可以设置;on是重发时间

[root@localhost ~]# ss -o
State      Recv-Q        Send-Q      Local Address:Port           Peer Address:Port
ESTAB      0         0           192.168.1.191:mysql         192.168.5.17:64906         timer:(keepalive,17min,0)
ESTAB      0         52           192.168.1.191:ssh            192.168.5.2:57611         timer:(on,448ms,0)
......

ss -e 显示详细的socket信息

[root@localhost ~]# ss -e
State      Recv-Q     Send-Q      Local Address:Port         Peer Address:Port
ESTAB      0      0        192.168.1.191:3306          192.168.5.82:63573    timer:(keepalive,7min43sec,0) uid:107 ino:13561506 sk:ffff8801135f57c0
ESTAB      0      0           192.168.1.191:3306         192.168.1.203:54196    timer:(keepalive,12min,0) uid:107 ino:13569965 sk:ffff8801b4f16540
ESTAB      0      52          192.168.1.191:ssh            192.168.5.2:57611    timer:(on,440ms,0) ino:12131853 sk:ffff88006b9586c0.
.....

ss -m 显示socket内存使用情况

[root@localhost ~]# ss -m
State      Recv-Q     Send-Q      Local Address:Port         Peer Address:Port
ESTAB      0      0               192.168.1.191:https        192.168.5.240:58565    mem:(r0,w0,f0,t0)
......

ss -p 显示使用socket的进程

[root@localhost ~]# ss -p | grep mysql
State      Recv-Q     Send-Q      Local Address:Port         Peer Address:Port
ESTAB      0      0           192.168.1.122:mysql        192.168.1.121:53969    users:(("mysqld",24205,110))
ESTAB      0      0           192.168.1.122:mysql        192.168.1.121:54783    users:(("mysqld",24205,45))
ESTAB      0      0           192.168.1.122:mysql        192.168.5.204:49995    users:(("mysqld",24205,106))
......

ss -i显示 tcp 内部信息

root@ubuntusvn:~# ss -i
State  Recv-Q Send-Q Local Address:Port      Peer Address:Port
ESTAB  0      0  192.168.1.122:mysql  192.168.1.121:54678   cubic wscale:7,7 rto:207 rtt:7.75/12 ato:40 cwnd:10 send 14.9Mbps rcv_rtt:1 rcv_space:14480
......

ss -s 显示socket使用概况

[root@localhost ~]# ss -s
Total: 509 (kernel 589)
TCP:   368 (estab 249, closed 9, orphaned 0, synrecv 0, timewait 1/0), ports 201

Transport Total     IP        IPv6
*         589       -         -        
RAW       0         0         0        
UDP       0         0         0        
TCP       359       79        280      
INET      359       79        280      
FRAG      0         0         0  

ss -4 仅显示 IPv4
ss -6 仅显示 IPv6

root@ubuntusvn:~# ss -6
State      Recv-Q Send-Q    Local Address:Port           Peer Address:Port   
ESTAB       0   0          ::ffff:127.0.0.1:31000       ::ffff:127.0.0.1:32000   
ESTAB       0   0          ::ffff:192.168.1.191:2100        ::ffff:208.75.196.43:http  

ss -t 仅显示 TCP 套接字
ss -u仅显示 ?UDP套接字
ss -d 仅显示 DCCP 套接字
ss -w 仅显示 ?RAW 套接字
ss -x 仅显示 Unix 套接字

比较netstat和ss的效率,ss比netstat快很多

root@ubuntusvn:~# time ?netstat ?-at
real    0m2.667s
user    0m0.000s
sys     0m0.020s

root@ubuntusvn:~# time ?ss
real    0m0.013s
user    0m0.000s
sys     0m0.008s

pstree和ss命令详解

标签:wrapper   keepalive   show   console   type   explicit   read   war   查看进程   

原文地址:https://blog.51cto.com/xinsir/2373466

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!