Linux基础知识培训_第1页
Linux基础知识培训_第2页
Linux基础知识培训_第3页
Linux基础知识培训_第4页
Linux基础知识培训_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux基础知识培训,Linux历史、发展 Linux基本操作 Linux驱动程序简介 Linux程序设计,Linux的历史和发展 Unix,Linux,GNU简介,什么是Unix Unix操作系统最初是由贝尔实验室(Bell Liboratory)研究开发的,20世纪70年代为DEC(数字设备公司,现在的compaq)的PDP系列计算机设计,现在已经成为非常流行的多用户、多任务操作系统,可运行在多种不同的硬件平台上。 Unix是AT cat1.c /就可以把代码粘帖到1.c文件里,按ctrl+d 保存代码。 cat 1.c 或more 1.c /都可以查看里面的内容。 gcc -o 1 1

2、.c /将1.c编译成.exe文件,我们可以用此命编译出代码。,Linux使用简介 Linux基本操作命令,8.chmod 命令 权限修改 用法:chmod 一位8进制数 filename。 eg: chmod u+x filenmame /只想给自己运行,别人只能读 /u表示文件主人, g 表示文件文件所在组。 o 表示其他人 ;r 表可读,w 表可写,x 表可以运行 chmod g+x filename /同组的人来执行 9. clear,date命令 clear:清屏,相当与DOS下的cls;date:显示当前时间。 10. mount 加载一个硬件设备 用法:mount 参数 要加载的

3、设备 载入点 eg: mount /dev/cdrom cd /mnt/cdrom /进入光盘目录 11. su 在不退出登陆的情况下,切换到另外一个人的身份 用法: su -l 用户名(如果用户名缺省,则切换到root状态) eg:su -l netseek (切换到netseek这个用户,将提示输入密码),Linux使用简介 Linux基本操作命令,12.whoami,whereis,which,id /whoami:确认自己身份 /whereis:查询命令所在目录以及帮助文档所在目录 /which:查询该命令所在目录(类似whereis) /id:打印出自己的UID以及GID。(UID:

4、用户身份唯一标识。GID:用户组身份唯一标识。每一个用户只能有一个唯一的UID和 GID) eg: whoami /显示你自已登陆的用户名 whereis bin 显示bin所在的目录,将显示为:/usr/local/bin which bin 13. grep,find grep:文本内容搜索;find:文件或者目录名以及权限属主等匹配搜索 eg: grep success * /*查找当前目录下面所有文件里面含有success字符的文件,Linux使用简介 Linux基本操作命令,14. kill 可以杀死某个正在进行或者已经是dest状态的进程 eg; ps ax 15. passwd

5、可以设置口令 16. history 用户用过的命令 eg: history /可以显示用户过去使用的命令 17. ! 执行最近一次的命令 18. mkdir命令 eg: mkdir netseek /创建netseek这个目录 19. tar 解压命令 eg: tar -zxvf nmap-3.45.tgz /将这个解压到nmap-3.45这个目录里 20. finger 可以让使用者查询一些其他使用者的资料 eg: finger /查看所用用户的使用资料,Linux驱动程序简介,Linux启动过程 RedHat典型启动过程当用户打开PC的电源,BIOS开机自检,按BIOS中设置的启动设备(

6、通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。,Linux驱动程序简介,Linux启动过程,Linux驱动程序简介,嵌入式Linux引导程序 嵌入式Linux很少使用像lilo,grub这类引导程序,嵌入式领域使用较多的是u-boot U-boot

7、介绍 U-boot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。其代码可以从 U-boot是由PPCBOOT发展起来的,是PowerPC、ARM9、Xscale、X86等系统通用的Boot方案。u-boot是一个open source的bootloader,目前版本是1.1.6。u-boot是在ppcboot以及armboot的基础上发展而来,目前发展得相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。 U-boot支持NFS网络文件系统和ELF格式的文件直接启动Linux,也能对Linux

8、 Image进行压缩后存储,启动的时候再解压到内存运行。,Linux驱动程序简介,Linux设备类型 Unix系统将设备分为三类:字符设备、块设备、网络接口,所以模块也分三类:字符模块、块模块、网络模块 字符设备 字符设备驱动通常至少实现:open,close,read和write系统调用。与普通文件区别在于大部分字符设备只能顺序访问数据通道。 rootlocalhost # ls /dev/ttyS* -l crw-rw- 1 root uucp 4, 64 2008-11-26 08:56 /dev/ttyS0 crw-rw- 1 root uucp 4, 65 2008-11-26 08

9、:56 /dev/ttyS1 关于TTY:一个 tty 设备得名于电传打字机的很老的简称, 并且起初只和连接到一台 UNIX 机器的物理或者虚拟终端有关联. 长时间以来, 这个名子还逐渐表示任何串口类型的设备, 因为终端连接也能够在这样的一个连接上建立. 一些物理 tty 设备的例子是串口, USB-串口 转换器, 以及某些类型的需要特殊处理来正确工作的调制解调器(例如传统的 Win-Modem 类型设备). tty 虚拟设备支持虚拟控制台以用来登录到一台计算机, 或者从键盘, 或者从网络连接, 或者通过一个 xterm 会话.,Linux驱动程序简介,Linux设备类型 块设备 块驱动程序,

10、除了给内核提供和字符驱动一样的接口外,还提供了专门面向块设备的接口,块设备的接口必须支持挂装(mount)文件系统。 rootlocalhost # ls /dev/sda* -l brw-r- 1 root disk 8, 0 2008-11-26 08:56 /dev/sda brw-r- 1 root disk 8, 1 2008-11-26 08:56 /dev/sda1 brw-r- 1 root disk 8, 2 2008-11-26 08:56 /dev/sda2 网络设备 网络接口由内核中的网络子系统驱动,负责发送和接收数据包。网络接口在文件系统中没有对应接点项,而是分配一个

11、唯一的名字(eth0 eth1.ethn)。,Linux驱动程序简介,Linux module module(模块)是 Linux 的一大革新。有了 module 之后,写 device driver (设备驱动程序)不再是一项恶梦,修改 kernel 也不再是一件痛苦的事了。因为你不需要每次要测试 driver 就重新编译kernel 一次。那简直是会累死人。Module 可以允许我们动态的改变 kernel,加载 device driver,或者卸载device driver,而不需要重启或者重新编译系统,它也能缩短我们 driver development 的时间。 Module操作 i

12、nsmod 加载模块 lsmod 查看系统已经加载的模块 rmmod 删除模块,Linux程序设计,Linux编程语言 最早的Linux是用汇编实现的,现在已经支持非常多的程序语言,但我们在Linux下编程用得最多的还是标准C语言,Linux程序设计,Linux程序 Linux应用程序表现为2中形式:可执行文件和脚本 可执行文件 类似于windows平台的.exe文件 可执行文件的3种格式(包括Unix平台):a.out,coff,elf a.out - assembler and link editor output 汇编器和链接编辑器的输出 a.out 是早期UNIX系统使用的可执行文件格

13、式,由 AT exit(0); ,Linux程序设计,第一个Linux C程序 第一个C程序的编译 rootlocalhost gcc -o hello helloworld.c 第一个C程序的执行 rootlocalhost ./hello Hello world! GCC常用的编译选项 -c 只进行预处理、编译和汇编,生成.o文件 -S 只进行预处理和编译,生成.s文件,是汇编源代码,熟悉汇编语言的可以通过读它来解决莫名其妙的问题 -E 只进行预处理,这会产生预处理后的结果到标准输出,可以通过重定向保存,这个在查找预定义产生的错误时可能有用 -C 预处理时不删除注释信息,这在-E时可能有用

14、,Linux程序设计,GCC常用的编译选项 -o 指定目标名称,在使用-c、-S参数时可用,没有这两个参数以及-E参数时指定最终可执行文件的名称,缺省是a.out -include file 功能同代码中的#include,个人更习惯使用#include,只有在忘记#include,调试编译时偶尔偷懒 -Dmacro=defval 定义一个宏,相当于代码中的#define macro defval -Umacro 取消宏的定义,相当于代码中的#undef macro -undef 取消对任何非标准宏的定义 -Idir 先在dir目录中查找include的头文件 -lname 链接libname

15、.so的库来编译程序 -Ldir 指定编译的时候搜索库的路径,与-I功能类似,但是是定义用来搜索.so的路径 -O0-3 编译器优化,数字越大,优化级别越高,0没有优化 -g 编译器编译时加入debug信息,便于gdb,valgrind等工具使用,关于valgrind的使用请参考另一篇 使用valgrind来管理cpp程序的内存 -pg 编译器加入信息给gprof使用使用gprof来优化cpp程序 -share 使用动态库 -static 禁止使用动态库,Linux程序设计,GNU make make在执行时,需要一个命名为Makefile的文件。这个文件告诉make以何种方式编译源代码和链接

16、程序。典型地,可执行文件可由一些.o文件按照一定的顺序生成或者更新。如果在你的工程中已经存在一个或者多个正确的Makefile。当对工程中的若干源文件修改以后,需要根据修改来更新可执行文件或者库文件,正如前面提到的你只需要在shell下执行“make”。make会自动根据修改情况完成源文件的对应.o文件的更新、库文件的更新、最终的可执行程序的更新。make通过比较对应文件(规则的目标和依赖,)的最后修改时间,来决定哪些文件需要更新、那些文件不需要更新。对需要更新的文件make就执行数据库中所记录的相应命令(在make读取Makefile以后会建立一个编译过程的描述数据库。此数据库中记录了所有各

17、个文件之间的相互关系,以及它们的关系描述)来重建它,对于不需要重建的文件make什么也不做。而且可以通过make的命令行选项来指定需要重新编译的文件。 推荐文章/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-02.html,Linux程序设计,文件 和Unix一样,linux系统的文件具有特别重要的意义,因为它为操作系统服务和设备提供了一个统一而简单的接口,在Linux中一切对象都是文件。Linux应用程序完全可以像使用文件一样使用串行口、打印机和其他设备。 文件和设备 linux下目录和硬件设备都被当

18、作文件,如CDROM,可以被挂载为一个目录,然后对该目录下的文件进行操作。 #mount t iso9660 /dev/hdc /mnt/cdrom 这个命令将cdrom设备挂载到/mnt/cdrom目录下 /dev/console 这设备代表系统控制台,所有系统的错误信息或者诊断信息都被送往该设备(终端或显示屏),Linux程序设计,文件 /dev/tty 如果一个进程有控制终端,特殊文件tty就是这个控制终端(键盘和显示屏,键盘和某个窗口)的别名(逻辑设备)。 /dev/null 空设备,所有写到该设备的信息都会被丢弃,读直接返回文件尾标志。人们通常把不需要的输出重定向到该设备。 对于文件

19、的操作,大部分时间你只需要做open,close,read,write,ioctl这5个操作。我们使用很少量的函数就可以对设备进行控制和访问,这些函数被称做系统调用,有linux直接提供,是应用程序通向操作系统内核的接口。操作系统的核心就是一组设备驱动程序,这是一些对系统硬件进行控制的底层函数。,Linux程序设计,内核空间和用户空间 Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为04G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0 xC0000000到0 xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的

20、3G字节(从虚拟地址0 x00000000到0 xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。 Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。每个进程有各自的私有用户空间(03G),这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。,Linux程序设

21、计,进程 程序和进程,程序是为了完成某种任务而设计的软件,比如OpenOffice是程序。什么是进程呢?进程就是运行中的程序。一个运行着的程序,可能有多个进程。 比如 LinuxSir.Org 所用的WWW服务器是apache服务器,当管理员启动服务后,可能会有好多人来访问,也就是说许多用户来同时请求httpd服务,apache服务器将会创建有多个httpd进程来对其进行服务。 创建,在Linux下产生新的进程的系统调用就是fork函数,这个函数名是英文中分叉的意思。为什么取这个名字呢?因为一个进程在运行中,如果使用了fork,就产生了另一个进程,于是进程就分叉了,所以这个名字取得很形象。fo

22、rk系统调用产生一个新的进程, 叫子进程, 调用进程叫父进程. 在Linux网络编程中经常用到fork()系统调用。例如一个客户机/Web服务器构建的网络环境中,Web服务器往往可以满足许多客户端的请求。如果一个客户机如果需要访问Web服务器需要发送一个请求,此时由服务器生成一个父进程,然后父进程通过fork()系统调用产生一个子进程,此时客户机的请求由子进程完成。父进程可以再度回到等待状态不断服务其他用户端。,Linux程序设计,进程 进程的属性 进程ID(PID):是唯一的数值,用来区分进程; 父进程和父进程的ID(PPID); 启动进程的用户ID(UID)和所归属的组(GID); 进程状

23、态:状态分为运行R、休眠S、已死亡的进程(Zombie)Z等; 进程执行的优先级; 进程所连接的终端名; 进程资源占用:比如占用资源大小(内存、CPU占用量); 进程状态 执行(Running)状态:CPU正在执行,即进程正在占用CPU。 就绪(Waiting)状态:进程已经具备的执行的一切条件,正在等待分配CPU的 处理时间片。 停止(Stoped)状态:进程不能使用CPU。 Zombie:这是由于某些原因被终止的进程,但是在task数据中仍然保留 task_struct结构。 它象一个已经死亡的进程。,Linux程序设计,进程管理 ps命令,显示进程状态 rootlocalhost # p

24、s -A PID TTY TIME CMD 1 ? 00:00:00 init 2 ? 00:00:00 migration/0 3 ? 00:00:00 ksoftirqd/0 4 ? 00:00:00 watchdog/0 5 ? 00:00:00 events/0 6 ? 00:00:00 khelper 7 ? 00:00:00 kthread 46 ? 00:00:00 kblockd/0 kill命令,结束进程 top命令,linux下性能分析工具,可实时显示各个进程的资源状况,类似于windows任务管理器,Linux程序设计,进程间通信 Linux下进程间通信的几种主要手段简介

25、: 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数); (BSD:是Unix的衍

26、生系统,常被当作工作站级别的 Unix 系统),Linux程序设计,进程间通信 消息队列(Message Queue):消息队列是消息的链接表,包括Posix消息队列systemV消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。 共享内存(Share Memory):使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。 (IPC:Inter-Process Co

27、mmunication进程间通信),Linux程序设计,进程间通信 信号量(Semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。,Linux程序设计,POSIX线程 线程类似于进程。如同进程,线程由内核按时间分片进行管理。在单处理器系统中,内核使用时间分片来模拟线程的并发执行,这种方式和进程的相同。而在多处理器系统中,如同多个进程,线程实际上一样可以并发执行。

28、那么为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间。不同的线程可以存取内存中的同一个变量。所以,程序中的所有线程都可以读或写声明过的全局变量。 POSIX是IEEE为要在各种UNIX操作系统上运行的软件,而定义API的一系列互相关联的标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。主要是为了提高程序的可移植性。,Linux程序设计,Socket 什么是socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Inter

29、net上的TCP/IP网络编程,必须理解Socket接口。Socket接口设计者最先是将接口放在Unix操作系统里面的。如果了解Unix系统的输入和输出的话,就很容易了解Socket了。网络的 Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返 回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。,Linux程序设计,Socket socket类型 常用的Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGR

30、AM)。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据 报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。,Linux程序设计,Socket Socket建立 为了建立Socket,程序可以调用Socket函数,该函数返回一个类似于文件描述符的句柄。socket函数原型为: int socket(int domain, int type, int protocol); domain指明所使用的协议族,通常为AF_INET,表示互联网协议族(TCP/IP协议族);type参数指定socket的类型:SOCK_STREAM 或SOCK_DGRAM,S

31、ocket接口还定义了原始Socket(SOCK_RAW),允许程序使用低层协议;protocol通常赋值0。 Socket()调用返回一个整型socket描述符,你可以在后面的调用使用它。 Socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用Socket函数时,socket执行体将建立一个Socket,实际上建立一个Socket意味着为一个Socket数据结构分配存储空间。Socket执行体为你管理描述符表。 两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址(IP地址)、本地主机端口、远端主机地址和远端协议端口。Socket数据结构中包含这五种信息。,L

32、inux程序设计,Socket Socket配置 通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该socket。面向连接的socket客户端通过 调用connect函数在socket数据结构中保存本地和远端信息。无连接socket的客户端和服务端以及面向连接socket的服务端通过调用 bind函数来配置本地信息。 Bind函数将socket与本机上的一个端口相关联,随后你就可以在该端口监听服务请求。Bind函数原型为: int bind(int sockfd,struct sockaddr *my_addr, int addrlen);,Lin

33、ux程序设计,Socket int bind(int sockfd,struct sockaddr *my_addr, int addrlen); Sockfd是调用socket函数返回的socket描述符,my_addr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)。 struct sockaddr结构类型是用来保存socket信息的: struct sockaddr unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data14; /* 14

34、 字节的协议地址 */ ; sa_family一般为AF_INET,代表Internet(TCP/IP)地址族;sa_data则包含该socket的IP地址和端口号。 另外还有一种结构类型: struct sockaddr_in short int sin_family; /* 地址族 */ unsigned short int sin_port; /* 端口号 */ struct in_addr sin_addr; /* IP地址 */ unsigned char sin_zero8; /* 填充0 以保持与struct sockaddr同样大小 */ ;,Linux程序设计,Socket

35、建立连接 面向连接的客户程序使用Connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为: int connect(int sockfd, struct sockaddr *serv_addr,int addrlen); Sockfd 是socket函数返回的socket描述符;serv_addr是包含远端主机IP地址和端口号的指针;addrlen是远端地质结构的长度。 Connect函数在出现错误时返回-1,并且设置errno为相应的错误码。进行客户端程序设计无须调用bind(),因为这种情况下只需知道目的机器 的IP地址,而客户通过哪个端口与服务器建立连接并不需要

36、关心,socket执行体为你的程序自动选择一个未被占用的端口,并通知你的程序数据什么时候到 打断口。 Connect函数启动和远端主机的直接连接。只有面向连接的客户程序使用socket时才需要将此socket与远端主机相连。无连接协议从不建立直接连接。面向连接的服务器也从不启动一个连接,它只是被动的在协议端口监听客户的请求。,Linux程序设计,Socket 建立连接 Listen函数使socket处于被动的监听模式,并为该socket建立一个输入数据队列,将到达的服务请求保存在此队列中,直到程序处理它们。 int listen(int sockfd, int backlog); Sockfd

37、 是Socket系统调用返回的socket 描述符;backlog指定在请求队列中允许的最大请求数,进入的连接请求将在队列中等待accept()它们。Backlog对队列中等待 服务的请求的数目进行了限制,大多数系统缺省值为20。如果一个服务请求到来时,输入队列已满,该socket将拒绝连接请求,客户将收到一个出错信息。 当出现错误时listen函数返回-1,并置相应的errno错误码。,Linux程序设计,Socket 建立连接 accept()函数让服务器接收客户的连接请求。在建立好输入队列后,服务器就调用accept函数,然后睡眠并等待客户的连接请求。 int accept(int so

38、ckfd, void *addr, int *addrlen); sockfd是被监听的socket描述符,addr通常是一个指向sockaddr_in变量的指针,该变量用来存放提出连接请求服务的主机的信息(某 台主机从某个端口发出该请求);addrten通常为一个指向值为sizeof(struct sockaddr_in)的整型指针变量。出现错误时accept函数返回-1并置相应的errno值。 首先,当accept函数监视的 socket收到连接请求时,socket执行体将建立一个新的socket,执行体将这个新socket和请求连接进程的地址联系起来,收到服务请求的 初始socket仍可

39、以继续在以前的 socket上监听,同时可以在新的socket描述符上进行数据传输操作。,Linux程序设计,Socket 数据传送 Send()和recv()这两个函数用于面向连接的socket上进行数据传输。 Send()函数原型为: int send(int sockfd, const void *msg, int len, int flags); Sockfd是你想用来传输数据的socket描述符;msg是一个指向要发送数据的指针;Len是以字节为单位的数据的长度;flags一般情况下置为0(关于该参数的用法可参照man手册)。 Send()函数返回实际上发送出的字节数,可能会少于你希望发送的数据。在程序中应该将send()的返回值与欲发送的字节数进行比较。当send()返回值与len不匹配时,应该对这种情况进行处理。 recv()函数原型为: int recv(int sockfd,void *buf,int len,unsigned int flags); Sockfd是接受数据的socket描述符;buf 是存放接收数据的缓冲区;len是缓冲的长度。Flags也被置为0。Recv()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论