linux内核调用命令 标题 linux内核函数和系统调用

linux内核操作的主要命令及作用

cp命令

专注于为中小企业提供网站设计制作、网站建设服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业内蒙古免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千多家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

该命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大

语法: cp [选项] 源文件或目录 目标文件或目录

说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中

-r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件

mv命令

用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同MSDOS下的ren和move的组合

语法:mv [选项] 源文件或目录 目标文件或目录

rm命令

该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除

rm命令的一般形式为:

rm [选项] 文件…

如果没有使用-r选项,则rm不会删除目录

该命令的各选项含义如下:

-f 忽略不存在的文件,从不给出提示

-r 指示rm将参数中列出的棚空配全部目录和子目录均递归地删除

Vi命令

插亏笑入模式

按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件

按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字

按「o」进入插入模式后,是插入新的一行,从行首开始输入文字

从插入模式切换为命令行模式

按「ESC」键

查找字符

「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止

「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止

离开vi

「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi

「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件

mkdir命令

功能:创建一个目录(类似MSDOS下的md命令)

语法:mkdir [选项] dir-name

说明:该命令创建由dir-name命名的目录。要求创建目录的用户在当前目录中(dir-name的父目录中)具有写权限,并且dirname不能是当前目录中已有的目录或 文件名称。

命令中各选项的含义为:

-p 可以是一个路径名称。此时若路径中的某些目录尚不存在, 加上此选项后, 系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录

cd 命令

功能:改变工作目录

语法:cd [directory]

说明:该命令将当前目录改变至directory所指定的目录。若没有指定directory, 则回到用户的主目录。为了改变到指定目录,用户必须拥有对指定目录的执行和读权限

ls 命令

功能: 列出目录的内容,该命令类似于DOS下的dir命令

语法:ls [选项] [目录或是文件]

对于每个目录,该命令将列出其中的所有子目录与文件。对于每个文件,ls将输出 其文件名以及所要求的其他信息。默认情况下,输出条目按字母顺序排序。当未给出目录名或是文件名时,就显示当前目录的信息。

命令中各选项的含义如下:

-a 显示指定目录下所有子目录与文件,包括隐藏文件

-c 按文件的修改时间排序

-t 显示时按修改时间(最近优先)而不是按名字排序。若文件修改时间相同,则 按字典顺序。修改时间取决于是否使用了c或u选顶。缺省的时间标记是最后一次修改时间

tar命令

tar可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案,如软盘。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。

语法:tar [主选项+辅选项] 文件或者目录

使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。

主选项:

-c 创建新的档案文件。如果用户链指想备份一个目录或是一些文件,就要选择这个选项。

-x 从档案文件中释放文件。

-f 使用档案文件或设备,这个选项通常是必选的。

-v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。

-z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩

文件或目录的访问权限

Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作

文件或目录的访问权限分为只读,只写和可执行三种。以文件为例,只读权限表示只允许读其内容,而禁止对其做任何的更改操作。可执行权限表示允许将该文件作为一个程序执行。文件被创建时,文件所有者自动拥有对该文件的读、写和可执行权限,以便于对文件的阅读和修改。用户也可根据需要把访问权限设置为需要的任何组合

有三种不同类型的用户可对文件或目录进行访问:文件所有者,同组用户、其他用户。所有者一般是文件的创建者。所有者可以允许同组用户有权访问文件,还可以将文件的访问权限赋予系统中的其他用户。在这种情况下,系统中每一位用户都能访问该用户拥有的文件或目录

每一文件或目录的访问权限都有三组,每组用三位表示,分别为文件属主的读、写和执行权限;与属主同组的用户的读、写和执行权限;系统中其他用户的读、写和执行权限。当用ls -l命令显示文件或目录的详细信息时,最左边的一列为文件的访问权限。

例如:

$ ls -l sobsrc. tgz

-rw-r–r– 1 root root 483997 Ju1 l5 17:3l sobsrc. tgz

横线代表空许可。r代表只读,w代表写,x代表可执行。注意这里共有10个位置。第一个字符指定了文件类型。在通常意义上,一个目录也是一个文件。如果第一个字符是横线,表示是一个非目录的文件。如果是d,表示是一个目录

例如:

- rw- r– r–

普通文件 文件主 组用户 其他用户

是文件sobsrc.tgz 的访问权限,表示sobsrc.tgz是一个普通文件;sobsrc.tgz的属主有读写权限;与sobsrc.tgz属主同组的用户只有读权限;其他用户也只有读权限。

chmod 命令

chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。

该命令有两种用法。一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。

文字设定法

chmod [who] [+ | - | =] [mode] 文件名

命令中各选项的含义为:

操作对象who可是下述字母中的任一个或者它们的组合:

u 表示“用户(user)”,即文件或目录的所有者。

g 表示“同组(group)用户”,即与文件属主有相同组ID的所有用户。

o 表示“其他(others)用户”

a 表示“所有(all)用户”。它是系统默认值。

操作符号可以是:

+ 添加某个权限。

- 取消某个权限。

= 赋予给定权限并取消其他所有权限(如果有的话)

设置mode所表示的权限可用下述字母的任意组合:

r 可读

w 可写

x 可执行

X 只有目标文件对某些用户是可执行的或该目标文件是目录时才追加x 属性。

s 在文件执行时把进程的属主或组ID置为该文件的文件属主。方式“u+s”设置文件的用户ID位,“g+s”设置组ID位。

t 保存程序的文本到交换设备上。

u 与文件属主拥有一样的权限。

g 与和文件属主同组的用户拥有一样的权限。

o 与其他用户拥有一样的权限。

文件名:以空格分开的要改变权限的文件列表,支持通配符

在一个命令行中可给出多个权限方式,其间用逗号隔开。

例如:chmod g+r,o+r example

使同组和其他用户对文件example 有读权限

chgrp命令

功能:改变文件或目录所属的组。

语法:chgrp [选项] group filename

该命令改变指定指定文件所属的用户组。其中group可以是用户组ID,也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的属主或超级用户,则不能改变该文件的组。

该命令的各选项含义为:

-R 递归式地改变指定目录及其下的所有子目录和文件的属组

chown 命令

功能:更改某个文件或目录的属主和属组。这个命令也很常用。例如root用户把自己的一个文件拷贝给用户xu,为了让用户xu能够存取这个文件,root用户应该把这个文件的属主设为xu,否则,用户xu无法存取这个文件。

语法:chown [选项] 用户或组 文件

说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。

该命令的各选项含义如下:

-R 递归式地改变指定目录及其下的所有子目录和文件的拥有者

-v 显示chown命令所做的工作

passwd命令

出于系统安全考虑,Linux系统中的每一个用户除了有其用户名外,还有其对应的用户口令。因此使用useradd命令增加时,还需使用passwd命令为每一位新增加的用户设置口令;用户以后还可以随时用passwd命令改变自己的口令

该命令的一般格式为: passwd [用户名] 其中用户名为需要修改口令的用户名。只有超级用户可以使用“passwd 用户名”修改其他用户的口令,普通用户只能用不带参数的passwd命令修改自己的口令

该命令的使用方法如下:

输入passwd Enter;

在new password:提示下输入新的口令(在屏幕上看不到这个口令):

系统提示再次输入这个新口令

su命令

它可以让一个普通用户拥有超级用户或其他用户的权限,也可以让超级用户以普通用户的身份做一些事情。普通用户使用这个命令时必须有超级用户或其他用户的口令。如要离开当前用户的身份,可以打exit

该命令的一般形式为: su [选项] [使用者帐号]

说明:若没有指定使用者帐号,则系统预设值为超级用户root。 该命令中各选项的含义分别为:

-c 执行一个命令后就结束

- 加了这个减号的目的是使环境变量和欲转换的用户相同

-m 保留环境变量不变

shutdown命令

shutdown 命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告信息。该命令还允许用户指定一个时间参数,可以是一个精确的时间,也可以是从现在开始的一个时间段。精确时间的格式是hh:mm,表示小时和分钟;时间段由“+”和分钟数表示。系统执行该命令后,会自动进行数据同步的工作

该命令的一般格式为: shutdown [选项] [时间] [警告信息] 命令中各选项的含义为:

-k 并不真正关机,而只是发出警告信息给所有用户。

-r 关机后立即重新启动。

-h 关机后不重新启动。

-f 快速关机,重启动时跳过fsck。

-n 快速关机,不经过init程序。

-c 取消一个已经运行的shutdown

需要特别说明的是,该命令只能由超级用户使用

free命令

free命令的功能是查看当前系统内存的使用情况,它显示系统中剩余及已用的物理内存和交换内存,以及共享内存和被核心使用的缓冲区。

该命令的一般格式为: free [-b | -k | -m] 命令中各选项的含义如下:

-b 以字节为单位显示。

-k 以K字节为单位显示。

-m 以兆字节为单位显示

df命令

功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息

语法:df [选项]

说明:df命令可显示所有文件系统对i节点和磁盘块的使用情况。

该命令各个选项的含义如下:

-a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。

-k 以k字节为单位显示。

-i 显示i节点信息,而不是磁盘块。

-t 显示各指定类型的文件系统的磁盘空间使用情况。

du命令

du的英文原义为“disk usage”,含义为显示磁盘空间的使用情况。

功能:统计目录(或文件)所占磁盘空间的大小。

语法:du [选项] [Names…]

说明:该命令逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出Names,则对当前目录进行统计。

该命令的各个选项含义如下:

-s 对每个Names参数只给出占用的数据块总数。

date命令

date命令的功能是显示和设置系统日期和时间。

该命令的一般格式为: date [选项] 显示时间格式(以+开头,后面接格式)

date 设置时间格式

命令中各选项的含义分别为:

-s datestr, –set datestr 设置datestr 描述的日期

注意:只有超级用户才有权限使用date命令设置时间,一般用户只能使用date命令显示时间。

ifconfig

作用

ifconfig用于查看和更改网络接口的地址和参数,包括IP地址、网络掩码、广播地址,使用权限是超级用户

格式

ifconfig -interface [options] address

主要参数

-interface:指定的网络接口名,如eth0和eth1

up:激活指定的网络接口卡

down:关闭指定的网络接口

address:设置指定接口设备的IP地址

netmask address:设置接口的子网掩码

应用说明

ifconfig是用来设置和配置网卡的命令行工具。为了手工配置网络,这是一个必须掌握的命令。使用该命令的好处是无须重新启动机器。

要赋给eth0接口IP地址207.164.186.2,并且马上激活它,使用下面命令:

#fconfig eth0 210.34.6.89 netmask 255.255.255.128

该命令的作用是设置网卡eth0的IP地址、网络掩码和网络的本地广播地址。若运行不带任何参数的ifconfig命令,这个命令将显示机器所有激活接口的信息。带有“-a”参数的命令则显示所有接口的信息,包括没有激活的接口。注意,用ifconfig命令配置的网络设备参数,机器重新启动以后将会丢失

如果要暂停某个网络接口的工作,可以使用down参数:

#ifconfig eth0 down

netstat

作用

检查整个Linux网络状态

格式

netstat [-acCeFghilMnNoprstuvVwx][-A][–ip]

主要参数

-a–all:显示所有连线中的Socket

-l–listening:显示监控中的服务器的Socket

-n–numeric:直接使用IP地址,而不通过域名服务器

-p–programs:显示正在使用Socket的程序识别码和程序名称

-t–tcp:显示TCP传输协议的连线状况

-u–udp:显示UDP传输协议的连线状况

-apn 查看开启的端口

应用实例

netstat主要用于Linux察看自身的网络状况,如开启的端口、在为哪些用户服务,以及服务的状态等。此外,它还显示系统路由表、网络接口状态等。可以说,它是一个综合性的网络状态的察看工具。在默认情况下,netstat只显示已建立连接的端口。如果要显示处于监听状态的所有端口,使用-a参数即可:

#netstat -a

lsof

作用

显示系统打开的文件

格式

lsof 〔options〕 filename

主要参数

lsof -a: 表示两个参数都必须满足时才显示结果

lsof -c string: 显示COMMAND列中包含指定字符的进程所有打开的文件

lsof -u username: 显示所属user进程打开的文件

lsof -g gid: 显示归属gid的进程情况

lsof +d /DIR/: 显示目录下被进程打开的文件

lsof +D /DIR/: 同上,但是会搜索目录下的所有目录,时间相对较长

lsof -d FD: 显示指定文件描述符的进程

lsof -n: 不将IP转换为hostname,缺省是不加上-n参数

lsof -i: 用以显示符合条件的进程情况

lsof -i:port: 查看端口运行的程序。

例如:查看22端口所运行的程序 #lsof -i:22

telnet

作用

telnet表示开启终端机阶段作业,并登入远端主机。telnet是一个Linux命令,同时也是一个协议(远程登陆协议)

格式

telnet [-8acdEfFKLrx][-b][-e][-k][-l][-n][-S][-X][主机名称IP地址通信端口]

ftp

作用

ftp命令进行远程文件传输。FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身,所以ftp既是协议又是一个命令。

格式

ftp [-dignv][主机名称IP地址]

应用说明

ftp命令是标准的文件传输协议的用户接口,是在TCP/IP网络计算机之间传输文件简单有效的方法,它允许用户传输ASCⅡ文件和二进制文件。为了使用ftp 来传输文件,用户必须知道远程计算机上的合法用户名和口令。这个用户名/口令的组合用来确认ftp会话,并用来确定用户对要传输的文件进行什么样的访问。另外,用户需要知道对其进行ftp会话的计算机名字的IP地址

用户可以通过使用ftp客户程序,连接到另一台计算机上;可以在目录中上下移动、列出目录内容;可以把文件从远程计算机机拷贝到本地机上;还可以把文件从本地机传输到远程系统中。ftp内部命令有72个,下面列出主要几个内部命令:

ls:列出远程机的当前目录

cd:在远程机上改变工作目录

lcd:在本地机上改变工作目录

close:终止当前的ftp会话

get(mget):从远程机传送指定文件到本地机

put(mput):从本地机传送指定文件到远程机

quit:断开与远程机的连接,并退出ftp

route

作用

route表示手工产生、修改和查看路由表

格式

#route [-add][-net|-host] targetaddress [-netmask Nm][dev]If]

#route [-delete][-net|-host] targetaddress [gw Gw] [-netmask Nm] [dev]If]

主要参数

-add:增加路由

-delete:删除路由

-net:路由到达的是一个网络,而不是一台主机

-host:路由到达的是一台主机

-netmask Nm:指定路由的子网掩码

gw:指定路由的网关

[dev]If:强迫路由链指定接口。

应用实例

route命令是用来查看和设置Linux系统的路由信息,以实现与其它网络的通信。要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现

在Linux系统中,设置路由通常是为了解决以下问题:该Linux系统在一个局域网中,局域网中有一个网关,能够让机器访问Internet,那么就需要将这台机器的IP地址设置为Linux机器的默认路由。使用下面命令可以增加一个默认路由:

route add 0.0.0.0 192.168.1.1

top

作用

top命令用来显示执行中的程序进程,使用权限是所有用户。

格式

top [-] [d delay] [q] [c] [S] [s] [i] [n]

主要参数

d:指定更新的间隔,以秒计算

q:没有任何延迟的更新。如果使用者有超级用户,则top命令将会以最高的优先序执行

c:显示进程完整的路径与名称

i:不显示任何闲置(Idle)或无用(Zombie)的行程

n:显示更新的次数,完成后将会退出top。

说明

top命令是Linux系统管理的一个主要命令,通过它可以获得许多信息。这里我们结合图1来说明它给出的信息

下面列出了详细解释

PID(Process ID):进程标示号

USER:进程所有者的用户名

PR:进程的优先级别

NI:进程的优先级别数值

VIRT:进程占用的虚拟内存值

RES:进程占用的物理内存值

SHR:进程使用的共享内存值

S:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数

%CPU:该进程占用的CPU使用率

%MEM:该进程占用的物理内存和总内存的百分比

TIME+:该进程启动后占用的总的CPU时间

Command:进程启动的启动命令名称,如果这一行显示不下,进程会有一个完整的命令行。

Linux的库函数是如何调用内核函数的

看系统调用,还有库函数,以前一直不明白,总是以为 系统调用跟库函数是一样的,但是今天才知道是不一样的。

库函数也就是我们通常所说的应用编程接口API,它其实就是一个函数定义,比如常见read()、write()等函猛镇数说明了如何获得一个给定的服务,但是系统调用是通过软中断向内核发出一个明确的请求,再者系统调用是在内核完成的,而用户态的函数是在函数库完成的。

系统调用发生在内核空间,因此如果在用户空间的一般应用程序中使用系统调用来进行文件操作,会有用户空间到内核空间切换的开销。事实上,即使在用户空间使用库函数来对文件进行操作,因为文件总是存在于存储介质上,因此不管是读写操作,都是对硬高并件(存储器)的操作,都必然会引起系统调用。也就是说,库函数对文件的操作实际上是通过系统调用来实现的。例如C库函数fwrite()就是通过write()系统调用来实现的。

这样的话,使用库函数也有系统调用的开销,为什么不直接使用系统调用呢?这是因为,读写文件通常是大量的数据(这种大量是相对于底层驱动的系统调用所实现的数据操作单位而言),这时,使用库函数就可以大大减少系统调用的次数。这一结果又缘于缓冲区技术。在用户空间和内核空间,对文件操作都使用了缓冲区,例如用fwrite写文件,都是先将内容写到用户空间缓冲区,当用户空间缓冲区满或者写操作结束时,才将用户缓冲区的内容写到内核缓冲区,同样的道理,当内核缓冲区满或写结束时才将内核缓冲区内容写到文件对应的硬件媒介。

系统调用与系统命令:系统命令相对API更高一层,每个系统命令都是一个可执行程序,比如常用的系统命令ls、hostname等,比如strace ls就会发现他们调用了诸如open(),brk(),fstat(),ioctl()等系统调用。

系统调用是用户进程进入内核的接口层,它本身并非内核函数,但他是由内核函数实现的,进入系统内核后,不同的系统调用会找到各自枝念粗对应的内核函数,这写内核函数被称为系统调用的“服务例程”。也可以说系统调用是服务例程的封装例程。

Linux 查看系统内核命令是什么

一、查看Linux内核版本命令(两察槐种方法):

1、cat /proc/version

[root@localhost ~]# cat /proc/者简version

Linux version 2.6.18-194.8.1.el5.centos.plus (mockbuild@builder17.centos.org) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Wed Jul 7 11:50:45 EDT 2010

2、uname -a

[root@localhost ~]# uname -a

Linux localhost.localdomain 2.6.18-194.8.1.el5.centos.plus #1 SMP Wed Jul 7 11:50:45 EDT 2010 i686 i686 i386 GNU/Linux

二、查看Linux系统版本的命令(3种方法):

1、lsb_release -a,即可列出所有版本信息:

[root@localhost ~]# lsb_release -a

LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch

Distributor ID: CentOS

Description: CentOS release 5.5 (Final)

Release: 5.5

Codename: Final

这个命令适用于所有的Linux发行版败嫌友,包括Redhat、SuSE、Debian…等发行版。

linux内核模块怎么调用

在编写linux内核模块的时候,有时候我们需要调用一只内核模块里面的函数,然而如果是在不同目录下面编译生成的内核模块,此时A模块去调用B模块的函数时候会出现函数未定义,无法调用的情况。那么以前我是在同一个目录下面,先后亩扮迅写两个makefile,然后编译生成两个不同的内核模块,这种方式可以正常实现A模块调用B模块里面的函数,不过非常麻烦。本博文将会针对这种情况提迅此出一种可以同时生成多个内核模块,不要再次编译的方面,下面贴出源码:

内核模块cal.ko:

#include linux/module.h

#include linux/init.h

MODULE_LICENSE("GPL");

int add(int a, int b) {

return a+b;

}

int sub(int a, int b) {

return a-b;

}

static int sym_init() {

return 0;

}

static int sym_exit() {

return 0;

}

module_init(sym_init);

module_exit(sym_exit);

EXPORT_SYMBOL(add);

EXPORT_SYMBOL(sub);

内核模块hello.ko

#include linux/module.h

#include linux/init.h

MODULE_LICENSE("GPL");

MODULE_AUTHOR("David Xie");

MODULE_DESCRIPTION("Hello World Module");

MODULE_ALIAS("a simplest module");

static int age = 10;

module_param(age, int, S_IRUGO);//allow all user to use this param

int add(int a, int b);

int sub(int a, int b);

static int hello_init(void)

{

printk("0"" Hello World! age = %d\n", add(10, 20));//调用内核模块cal.ko里面的add函缺消数

return 0;

}

static void hello_exit(void)

{

printk("0""hello exit %d\n", sub(30,10));//调用内核模块cal.ko里面的sub函数

}

module_init(hello_init);

module_exit(hello_exit);

可以生成多个内核模块的makefile

ifneq ($(KERNELRELEASE),)

obj-m := cal.o hello.o

cal-objs := operator.o

hello-objs := main.o

else

KDIR := /lib/modules/2.6.32-21-generic/build

all:

make -C $(KDIR) M=$(PWD) modules

clean:

rm -f *.ko *.o *.mod.o *.mod.c *.symvers *.order

endif

此时在当前目录执行make就会产生cal.ko和hello.ko两个内核模块


当前名称:linux内核调用命令 标题 linux内核函数和系统调用
分享网址:http://pwwzsj.com/article/ddpgoij.html