版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1LINUX简介
2LINUX的安装与启动
VMware虚拟机3LINUX的安装45vim编辑器
vim编辑器鼻祖输入模式命令模式6vim开始编辑78认识SHELL
认识Shell英文单词Shell可直译为“贝壳”。“贝壳”是动物作为外在保护的一种工具。可以这样认为,Linux中的Shell就是Linux内核的一个外层保护工具,并负责
完成用户与内核之间的交互9命令行操作bash除了在命令编辑功能上比sh有很大改进外,还增加了特有功能极大地方便了用户在Shell命令行上的操作。补齐命令与文件名查询命令历史定义命令别名等等1011SHELL核心命令
12获取联机帮助(man手册)
获取联机帮助man使用man命令可以找到特定的联机帮助页,并提供简短的命令说明。一般语法格式为:联机帮助页提供了指定命令commandname的相关信息,包括:名称、函数、语法以及可选参数描述等。无论帮助有多长,都遵循这个格式显示。在页面很多的情况下使用PageUp和PageDown键翻页。最后,使用“:q”退出帮助页面。mancommandname13获取联机帮助通常联机帮助信息包括以下几个部分:NAME:命令的名称SYNOPSIS:命令的常用参数DESCRIPTION:命令的一般描述以及用途OPTIONS:描述命令所有的参数或选项SEEALSO:列出联机帮助页中与该命令直接相关或功能相近的其他命令BUGS:解释命令或其输出中存在的任何已知的问题或缺陷EXAMPLES:普通的用法示例AUTHORS:联机帮助页以及命令的作者14获取联机帮助用户并不总能把要使用的命令记忆完整,但只要知道命令的一个要点,就可以使用选项“-k”按照关键字搜索相关内容。wdl@UbuntuFisher:~/mywork$man-k"listdirectory"dir(1)-listdirectorycontentsls(1)-listdirectorycontentsvdir(1)-listdirectorycontents1516LINUX用户管理命令
添加用户adduser语法:adduser<username>实例:
#addusernewuser
添加用户名为newuser的新用户
17删除用户deluser语法:deluser<username>使用方法:
deluser--remove-homeuser1
删除用户user1的同时删除用户的工作目录18删除用户组delgroup语法:delgroupgroupname使用方法:
delgroupgroupname119更改文件权限chmod语法:chmod[options]file示例:
chmodu+rfile
给file开放所有者读权限
chmodg+wfile
给file开放组成员写权限
chmodo-xfile
给file屏蔽其他人执行权限
chmodu=rxfile
设置file所有者权限为r-x20更改文件权限chmod将文件的权限用3个八进制数来表示,可以更方便地修改多个权限:rwxr-xr-xrw-r--r--111101101(755)110100100(644)示例:
chmod644file
将file的权限改成rw-r--r--
chmod755file
将file的权限改成rwxr-xr-x21更改文件所有者chown更改指定文件的所有者语法:chownusernamefile示例:
chownfoofile
将file的所有者更改为foo22更改文件所属组chgrp更改指定文件的所属组语法:chgrpgroupnamefile示例:
chownfoofile
将file的所属组更改为foo2324LINUX进程管理命令
以指定优先级运行程序nice用于可以改变程序执行的优先权等级语法:
nice
[-n
<优先等级>][--help][--version][执行指令]将ls的优先序加1并执行:
nice
-n
1
ls
25动态修改正在运行的程序的优先级renice改变优先级可以通知系统给某个进程更多或者更少的CPU时间。语法:
reniceincrement[-g|-p|-u]ID
-g
<程序群组名称>
使用程序群组名称,修改所有隶属于该程序群组的程序的优先权。
-p
<程序识别码>
改变该程序的优先权等级,此参数为预设值。
-u
<用户名称>
指定用户名称,修改所有隶属于该用户的程序的优先权。26ps命令ps显示进程
(process)
的动态语法:
ps[options]常见的参数:-A
列出所有的行程-w
显示加宽可以显示较多的资讯-au
显示较详细的资讯-aux
显示所有包含其他使用者的行程
27top命令28pstree将所有行程以树状图显示,
树状图将会以
pid
(如果有指定)
或是以init这个基本进程为根,如果有指定使用者id,
则树状图会只显示该使用者所拥有的进程。参数:
-a
显示该进程的完整指令及参数,
如果是被记忆体置换出去的进程则会加上括号
-c
如果有重覆的进程名,
则分开列出29终止进程kill使用kill命令终止进程kill[-signal]PIDsignal是信号,PID是进程号kill命令向指定的进程发出一个信号signal,在默认的情况下,kill命令向指定进程发出信号15,正常情况下,将杀死那些不捕捉或不忽略这个信号的进程3031LINUX系统目录结构简介
文件系统结构Linux文件系统就是一个树形的分层组织结构。将根(/)作为整个文件系统的惟一起点,其他所有目录都从该点出发。将Linux的全部文件按照一定的用途归类,合理地挂载到这颗“大树”的“树枝”或“树叶”上,如图所示。而这些全不用考虑文件的实际存储位置,无论是存在硬盘上,还是在CD-ROM或USB存储器中,甚至是网络终端。3233LINUX文件管理核心命令
浏览目录pwdpwd命令用于显示用户在文件系统中的当前位置。pwd命令一般语法格式为:pwd命令没有任何选项和参数,命令执行结果显示绝对路径名。例如通过如下pwd的执行结果可以判断当前位置为用户主目录。其实通过bash的命令提示符同样可以判断当前的位置(“~”表示用户主目录)。当然用户不能既希望与所有的shell命令提示符都显示当前路径名,比如sh的命令提示符就没有任何提示。因此,学会使用pwd是最可靠的。pwdwdl@UbuntuFisher:~$pwd/home/wdl34浏览目录lsls命令用于列出用户有权访问的任何目录的内容。ls命令一般语法格式为:选项描述-a显示指定目录下所有子目录与文件,包括隐藏文件-A显示指定目录下所有子目录与文件,包括隐藏文件,但不列出“.”、“..”-c按文件的修改时间排列-F在目录名后面标记“/”,可执行文件后面标记“*”,符号链接后面标记“@”,管道后面标记“|”,socket文件后面标记“=”-l以列表格式来显示文件的详细信息-L若指定文件为一个符号链接文件,则显示链接所指向的文件-o与-l选项相同,只是不显示拥有者的信息-r按字母逆序或最早优先的顺序显示输出结果-R递归式地显示指定目录的各个子目录中的文件-t按修改时间顺序显示输出结果-u按文件上次存取的时间显示输出结果-h文件大小按k、M、G为单位显示,与-l一起使用ls[-a|-A|-c|-F|-l|-L|-o|-r|-R|-t|-u][filename|directory]35cdcd命令用于改变工作目录。用户使用cd命令可以自由进入授权的任何目录中,是用户浏览文件系统的基本工具。cd命令一般语法格式为:其中,directory表示目标路径名。如果单独使用cd命令,用户将返回到自己的主目录中。如果cd命令的目标路径不正确,系统会提示“没有这个文件或目录”,否则就从当前位置跳转到目标位置。目标路径名可以是绝对路径,也可以是相对路径。使用绝对路径,无论用户当前处在什么位置,只要是授权用户,就可以转移到指定目录中;使用相对路径时,cd命令以当前位置为起点,跳转到指定目录中。因此,这就需要用户事先明确自己所处的位置。cd[directory]3637LINUX文件资源管理
touchtouch命令用于创建一个新文件。touch命令一般语法格式为:其中filename是文件名。如果这个文件是已有文件,就改变这个文件的最后修改日期。touch[filename]wdl@UbuntuFisher:~$touchTextfile.txt#创建一个空白文件wdl@UbuntuFisher:~$ls–lTextfile.txt#查看这个文件,创建日期为“2007-09-2001:07”-rw-r--r--1wdlwdl02007-09-2001:07Textfile.txtwdl@UbuntuFisher:~$touchTextfile.txt#修改这个文件的时间戳wdl@UbuntuFisher:~$ls–lTextfile.txt#再次查看这个文件,创建日期为“2007-09-2001:47”-rw-r--r--1wdlwdl02007-09-2001:47Textfile.txt38file在前面介绍过在Linux文件系统中,文件扩展名不总是被使用或被一致地使用。那么,如果一个文件没有扩展名,或者文件与其扩展名不符时怎么办呢?file命令功能用于判定一个文件的类型。file命令一般语法格式为:其中filename是文件名。命令的输出将显示该文件是二进制文件、文本文件、目录文件、设备文件,还是Linux中其他类型的文件。以上使用file命令对两个文件/usr/games/banner和Textfile.txt的进行了文件类型判断。第一个文件为二进制可执行文件,第二个文件为UTF-8格式的文本文件。file[filename]wdl@UbuntuFisher:~$file/usr/games/bannerbanner:ELF32-bitLSBexecutable,Intel80386,version1(SYSV),forGNU/Linux2.6.0,dynamicallylinked(usessharedlibs),strippedwdl@UbuntuFisher:~$fileTextfile.txtTextfile.txt:UTF-8Unicodetext39cpcp命令用于将给出的文件或目录拷贝到另一个文件或目录中。cp命令一般语法格式为:cp命令的参数:SOURCE表示源文件,DEST表示目标文件。无论是源文件还是目标文件,既可以是普通文件,也可以是目录。cp命令支持将多个源文件复制到目标目录中。当然,复制操作需要具有必要的权限,通常至少要对源文件具有读取权限,对目标目录或文件具有写入权限。cp[-a|-d|-f|-i|-p|-r|-l|-v][SOURCE][DEST]选项描述-a该选项通常在拷贝目录时使用,保留链接、文件属性,并递归地拷贝目录,其作用等于dpr选项的组合-d拷贝时保留链接-f非交互模式的复制操作。覆盖已经存在的目标文件而不提示-i交互模式的复制操作,与-f选项相反。在覆盖目标文件之前将给出提示,要求用户确认,回答“y”表示目标文件将被覆盖-p除复制源文件内容外,还将其修改时间和访问权限也同时复制-r若源文件是一个目录,cp命令将递归地复制该目录下的所有子目录和文件40以上命令完成了将文件File_1.txt的内容复制到File_2.txt中。在使用cp命令第一次复制File_1.txt时,创建了文件File_2.txt。再次使用cp命令,带有“-i”选项,系统提示是否需要覆盖,回答“Y”将删除旧的File_2.txt文件,重新创建一个File_2.txt文件(使用ls命令查看File_2.txt的创建时间就可以知道)。以上命令完成了整个目录的复制,记住必须使用“-r”选项,意为将dir1目录中的文件、子目录及其文件,一并复制到dir2目录中。wdl@UbuntuFisher:~$cpFile_1.txtFile_2.txtwdl@UbuntuFisher:~$cp-iFile_1.txtFile_2.txtcp:是否覆盖‘File_2.txt’?Ywdl@UbuntuFisher:~$cp–rdir1/dir2/41
mvmv命令用于将文件/目录改名,或将文件/目录由源目录移动到目标目录中。mv命令一般语法格式为:mv命令的参数:SOURCE表示源文件,DEST表示目标文件。无论是源文件还是目标文件,既可以是普通文件,也可以是目录。mv[-i|-f|-v][SOURCE][DEST]选项描述-f非交互模式的移动操作。覆盖已经存在的目标文件而不提示-i交互模式的移动操作。在覆盖目标文件之前将给出提示,要求用户确认,回答“y”表示目标文件将被覆盖-v显示详细的移动过程42以上命令完成了将文件File_1.txt移动到dir1目录下,并且文件名改为myFile.txt。首先使用mv命令将File_1.txt移动到dir1目录下。之后使用mv命令将File_2.txt移动到dir1下,带有“-i”选项,系统提示“是否需要覆盖?”,回答“Y”将删除旧的myFile.txt文件,重新创建一个myFile.txt文件。以上命令完成目录的改名,使用“-v”选项,系统给出相应提示。wdl@UbuntuFisher:~$mvFile_1.txtdir1/myFile.txtwdl@UbuntuFisher:~$mv-iFile_2.txtdir1/myFile.txtmv:是否覆盖‘dir1/myFile_1.txt’?Ywdl@UbuntuFisher:~$mv–vdir1dir243rm用于在用户授权情况下,完成一个或多个文件/目录删除。rm命令可以将目录下的子目录、文件全部删除。对于链接文件,只是删除链接,原有文件保持不变。rm命令一般语法格式为:DEST表示目标文件,既可以是普通文件,也可以是目录。rm命令支持多文件/目录删除。删除操作需要具有必要的权限,通常至少要对目标文件/目录具有写入权限。选项描述-f非交互模式的删除操作,忽略不存在的文件-i交互模式的删除操作。在删除目标文件之前将给出提示,要求用户确认,回答“y”表示目标文件将被删除-r若源文件是一个目录,rm命令将递归地删除该目录下的所有子目录和文件-v显示详细的删除过程rm[-i|-f|-r|-v][DEST]44文件与目录命令创建、删除目录文件夹是文件的集合,将Linux系统的文件合理的放置相应文件夹下,会使系统变得有条不紊。目录操作主要包括创建和删除目录。mkdirrmdir45mkdirmkdir命令用于创建一个目录。mkdir命令一般语法格式为:其中,directory_name为要创建的目录名,并且不能是已有的目录,通常不允许嵌套创建子目录。使用选项“-p”表示可以嵌套创建子目录,即多层目录。需要说明的是,创建目录的用户在工作目录应具有写入权限。假设要创建下面这样结构的目录。mkdir[-p]directory_name
dir1dir1/dir2dir1/dir2/dir346rmdirrmdir命令用于删除一个目录。rmdir命令一般语法格式为:其中,directory_name为要删除的一个或多个目录名。使用选项“-p”表示可以递归删除子目录,即多层目录。需要说明的是,删除的目录必须为空目录,并且必须具有对该目录有写入权限。假设要删除下面这样结构的目录。rmdir[-p]directory_name
dir1dir1/dir2dir1/dir2/dir34748LINUX文件内容显示
cat用于依次读取指定文件的内容,并在标准输出设备上显示。cat命令一般语法格式为:选项描述-v用一种特殊形式显示控制字符,LFD与TAB除外-T将TAB显示为“^I”,只与“-v”选项同时使用-E在每行的末尾显示一个“$”符,只与“-v”选项同时使用-u输出不经过缓冲区cat[-v|-T|-E|-u][filename]49moremore命令用于在终端屏幕按屏显示文本文件。该命令依次显示一屏文本,显示满之后停下来,并在终端底部显示“--more--”,系统还将同时显示出已显示文本占全文的百分比。若要继续显示,按Enter键为一行一行显示,按空格键为一屏一屏显示。more命令一般语法格式为:通常more命令可以借用管道符“|”,与其他命令同时使用,以控制前一个命令在屏幕上显示过多的问题。more[-p|-d|-s|-num]filename
选项描述-p显示下一屏之前清屏-d在每屏的底部显示更友好的提示信息:“--More--[Pressspacetocontinue,'q'toquit.]”-s文件中连续的空白行压缩为一个空白行显示-numnum为要求在每一屏显示的行数50lessless命令的功能几乎与more命令相同,也是用于在终端屏幕按屏显示文本文件。该命令依次显示一屏文本。不同之处在于less命令在显示文本时,允许用户使用“
”键、“
”键前后翻阅文件。需要说明的是,使用less命令进入显示状态后,按“q”或“Q”退出显示状态。51
head如果用户通过查看文件前几行,就可以大体知晓文件内容,就不必浏览整个文件。head命令用于显示文件或标准输入的前几行。head命令一般语法格式为:head[-num]filename
选项“-num”表示显示指定文件的前num行内容。如果单独使用head命令,默认显示10行的内容。如果没有目标文件,head命令就从标准输入读取内容。以下命令执行结果将/proc/cpuinfo文件的前8行显示出来。wdl@UbuntuFisher:~$head
-8/proc/cpuinfoprocessor:0vendor_id:GenuineIntelcpufamily:15model:4modelname:Intel(R)Xeon(TM)CPU3.20GHzstepping:8cpuMHz:3200.088cachesize:2048KB52tail与head相反,tail命令用于显示文件或标准输入的最后几行。tail命令一般语法格式为:其中,选项+num表示从第num行以后开始显示;-num表示从距文件尾num行处开始显示。如果单独tail命令的话,默认显示末尾的10行内容。以下命令执行结果将/proc/cpuinfo文件的末尾8行显示出来。tail[+/-num]filename
wdl@UbuntuFisher:~$tail
-8/proc/cpuinfofpu:yesfpu_exception:yescpuidlevel:5wp:yesflags:fpuvmedepsetscmsrpaemcecx8apicsepmtrrpgemcacmovpatpse36clflushdtsacpimmxfxsrssesse2ssnxconstant_tscuppnids_cplbogomips:6425.31clflushsize:645354LINUX中的“链接文件”
创建链接文件链接文件就类似于微软Windows的快捷方式,只保留目标文件的地址,而不占用存储空间。使用链接文件与使用目标文件的效果是一样的。为链接文件指定不同的访问权限,以控制对文件的共享和安全性的问题。Linux中有两种类型的链接:硬链接是利用Linux中为每个文件分配的物理编号——inode建立链接。因此,硬链接不能跨越文件系统。软链接(符号链接)是利用文件的路径名建立链接。通常建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性。需要注意的是,如果是修改硬链接的目标文件名,链接依然有效;如果修改软链接的目标文件名,则链接将断开;对一个已存在的链接文件执行移动或删除操作,有可能导致链接的断开。假如删除目标文件后,重新创建一个同名文件,软链接将恢复,硬链接不再有效,因为文件的inode已经改变。55ln命令可以用于创建文件的链接文件。ln命令一般语法格式为:其中,选项“-s”表示为创建软链接。在缺省情况下,创建硬链接。参数target为目标文件,link_name为链接文件名。如果链接文件名已经存在但不是目录,将不做链接。目标文件可以是任何一个文件名,也可以是一个目录。ln[-s]targetlink_name
wdl@UbuntuFisher:~$ln-s/proc/cpuinfomycpuinfowdl@UbuntuFisher:~$ls–lmycpuinfolrwxrwxrwx1wdlwdl132007-09-2200:43mycpuinfo->/proc/cpuinfo以上命令为/proc/cpuinfo文件创建了一个软链接文件。使用“ls–l”命令可以查看到新创建的链接文件所指向的目标文件名。5657LINUX文件的归档与压缩
tartar命令主要用于将若干文件或目录合并为一个文件,以便备份和压缩。当然,之后出现tar程序的改进版本,可以实现在合并归档的同时进行压缩。tar命令符号模式的一般语法格式为:tar[-t|-x|-u|-c|-v|-f|-j|-z]tarfilefilelist选项描述-t显示归档文件中的内容-x释放归档文件-u更新归档文件-c创建一个新的归档文件-v显示归档和释放的过程信息-f用户指定归档文件的文件名,否则使用默认名称-j由tar生成归档,然后由bzip2压缩-z由tar生成归档,然后由gzip压缩5859GCC编译器
60GCC编译器的版本GNUCompilerCollectionC,C++,Objective-C,Fortran,Java,AdaGCC4.3.0GCC2.95July31,1999GCC3.0June18,2001GCC3.2August14,2002GCC3.3May13,2003Mar5,2008December3,19976061GCC编译过程GCC的编译流程分为四个步骤:预处理(Pre-Processing)编译(Compiling)汇编(Assembling)链接(Linking)编辑器预处理器编译器链接汇编处理源代码*.c预处理文件*.i汇编文件*.s汇编文件*.o可执行程序*.exe61GCC的基本用法和选项Gcc最基本的用法是∶gcc[options][filenames]-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。-ooutput_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。-Ldirname,将dirname所指出的目录加入到程序函数档案库文件的目录列表中,是在链接过程中使用的参数。6263GDB调试工具
64Gdb调试流程查看文件(gdb)l设置断点
(gdb)b6查看断点情况
(gdb)infob运行代码
(gdb)r查看变量值(gdb)pn单步运行
(gdb)n(gdb)s恢复程序运行
(gdb)c帮助(gdb)help[command]6465MAKE工程管理器
Make简介工程管理器,顾名思义,是指管理较多的文件Make工程管理器也就是个“自动编译管理器”,这里的“自动”是指它能构根据文件时间戳自动发现更新过的文件而减少编译的工作量,同时,它通过读入Makefile文件文件的内容来执行大量的编译工作Make将只编译改动的代码文件,而不用完全编译。66Makefile基本结构Makefile是Make读入的唯一配置文件由make工具创建的目标体(target),通常是目标文件或可执行文件要创建的目标体所依赖的文件(dependency_file)创建每个目标体时需要运行的命令(command)注意:命令行前面必须是一个”TAB键”,否则编译错误为:***missingseparator.Stop.67Makefile基本结构Makefile格式
target:dependency_files<TAB>command例子hello.o:hello.chello.h gcc–chello.c–ohello.o68Makefile变量一个复杂一些的例子sunq:kang.oyul.o gcckang.oyul.o-osunqkang.o:kang.ckang.h gcc–Wall–O-g–ckang.c-okang.oyul.o:yul.c gcc-Wall–O-g–cyul.c-oyul.o注释:-Wall:表示允许发出gcc所有有用的报警信息.-c:只是编译不链接,生成目标文件”.o”-ofile:表示把输出文件输出到file里关于更多的用man工具6970LINUX-IO编程
71标准I/O-介绍不仅在UNIX系统,在很多操作系统上都实现了标准I/O库标准I/O库由ANSIC标准说明标准I/O库处理很多细节,如缓冲分配、以优化长度执行I/O等,这样使用户不必关心如何选择合适的块长度标准I/O在系统调用函数基础上构造的,它便于用户使用标准I/O库及其头文件stdio.h为底层I/O系统调用提供了一个通用的接口。
72标准I/O-流和FILE对象文件指针FILE指针:每个被使用的文件都在内存中开辟一个区域,用来存放文件的有关信息,这些信息是保存在一个结构体类型的变量中,该结构体类型是由系统定义的,取名为FILE。标准I/O库的所有操作都是围绕流(stream)来进行的,在标准I/O中,流用FILE*来描述。标准I/O库是由DennisRitchie在1975年左右编写的流(stream)定义:所有的I/O操作仅是简单的从程序移进或者移出,这种字节流,就称为流。分类:文本流/二进制流。
73标准I/O-文件缓冲缓冲文件系统目的:尽量减少使用read/write的调用定义:系统自动的在内存中为每一个正在使用的文件开辟一个缓冲区,从内存向磁盘输出数据必须先送到内存缓冲区,装满缓冲区在一起送到磁盘中去。从磁盘中读数据,则一次从磁盘文件将一批数据读入到内存缓冲区中,然后再从缓冲区逐个的将数据送到程序的数据区。分类:全缓冲,行缓冲,不缓冲。非缓冲文件系统(1985年)定义:系统不自动开辟确定大小的缓冲区,而是由程序为每个文件设定缓冲区。
74标准I/O-stdin,stdout,stderr标准I/O预定义3个流,他们可以自动地为进程所使用描述文件描述符(int)文件描述符对应的宏(int)文件指针(FILE*)标准输入0STDIN_FILENOstdin标准输出1STDOUT_FILENOstdout标准错误输出2STDERR_FILENOstderr
75标准I/O库-打开流 下列三个函数可用于打开一个标准I/O流:FILE*fopen(constchar*path,constchar*mode);fopen()打开由path指定的一个文件。mode的值如下:
76标准I/O-fopen()-mode参数打开标准I/O流的mode参数:rt或rb打开只读文件,该文件必须存在。r+或r+b打开可读写的文件,该文件必须存在。w或wb打开只写文件,若文件存在则文件长度清为0,即会截断文件以前内容。若文件不存在则建立该文件。w+或w+b或wb+打开可读写文件,若文件存在则文件长度清为零,即会截断文件以前内容。若文件不存在则建立该文件。a或ab以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。a+或a+b或ab+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。*当给定“b”参数时,表示以二进制方式打开文件。
77标准I/O库-fclose()fclose()用于关闭一个已经打开的流: intfclose(FILE*stream);fclose()调用成功返回0,失败返回EOF,并设置errno在该文件被关闭之前,刷新缓冲中的数据。如果标准I/O库已经为该流自动分配了一个缓冲,则释放此缓冲。当一个进程正常终止时(直接调用exit函数,或从main函数返回),则所有带未写缓冲数据的标准I/O流都被刷新,所有打开的标准I/O流都被关闭。在调用fclose()关闭流后对流所进行的任何操作,包括再次调用fclose(),其结果都将是未知的。
78标准I/O库-读写流-字符I/O-输入以下三个函数可用于一次读一个字符:三个函数的返回:返回值为int类型。若成功则为下一个字符,若已处文件尾端或出错为EOF函数getchar()等同于getc(stdin)注意,不管是出错还是到达文件尾端,这三个函数都返回同样的值。为了区分这两种不同的情况,必须调用ferror()或feof()。getc()的实现是一个宏,而fgetc()是一个函数。
79标准I/O库-读写流-字符I/O-输出以下三个函数可用于一次输出一个字符:putchar(c)等价于putc(c,stdout)。出错返回EOF。
getc()/getchar()/putc()/putchar()实现为宏,fgetc()/fputc()实现为函数,请根据情况选择。
80标准I/O库-读写流-行I/O-输入下列两个函数提供每次输入一行的功能:两个函数返回:若成功则为buf,若已处文件尾端或出错则为null这两个函数都指定了缓冲地址,读入的行将送入其中。gets()从标准输入读,而fgets()则从指定的流读。对于fgets(),必须指定缓冲的长度n。此函数一直读到下一个新行符为止,但是不超过n-1个字符,读入的字符被送入缓冲。该缓冲以null字符结尾。如若该行,包括最后一个新行符的字符数超过n-1,则只返回一个不完整的行,而且缓冲总是以null字符结尾。对fgets()的下一次调用会继续读该行。gets()是一个不推荐使用的函数,因为调用者在使用gets()时不能指定缓冲的长度,这样就可能造成缓冲越界(如若该行长于缓冲长度),写到缓冲之后的存储空间中,从而产生不可预料的后果。gets()与fgets()的另一个区别是,gets()并不将新行符存入缓冲中。
81标准I/O库-读写流-行I/O-输出下列两个函数提供每次输出一行的功能:两个函数返回:若成功则为非负值,若出错则为EOF函数fputs()将一个以null符终止的字符串写到指定的流,终止符null不写出。注意,这并不一定是每次输出一行,因为它并不要求在null符之前一定是新行符。通常,在null符之前是一个新行符,但并不要求总是如此。puts()将一个以null符终止的字符串写到标准输出,终止符不写出。但是,puts()然后又将一个新行符写到标准输出。puts()并不像它所对应的gets()那样不安全。但是我们还是应避免使用它,以免需要记住它在最后又加上了一个新行符。如果总是使用fgets()和fputs(),那么就会熟知在每行终止处我们必须自己加一个新行符。
82标准I/O库-读写流-二进制I/O下列两个函数以执行二进制I/O(directI/O)操作:两个函数的返回:读或写的对象数对于二进制数据我们更愿意一次读或写整个结构。为了使用getc()或putc()做到这一点,必须循环读取整个结构,一次读或写一个字节。(效率低)fputs()在遇到null字节时就停止,而在结构中可能含有null字节,所以不能使用每次一行函数实现这种要求。如果输入数据中包含有null字节或换行符,则fgets()也不能正确工作。(实现限制)
83标准I/O库-定位流-fseek()/ftell()/rewind()fseek()/ftell()/rewind()函数原型:ftell()用于取得当前的文件位置,调用成功则为当前文件位置指示,若出错则为-1Lfseek()用户设定stream流的文件位置指示,调用成功返回0,失败返回-1,并设置errnofseek()的whence参数:SEEK_SET/SEEK_CUR/SEEK_END。rewind()用于设定流的文件位置指示为文件开始,该函数调用成功无返回值。rewind()等价于(void)fseek(stream,0L,SEEK_SET)84系统IO
85UNIX-输入和输出文件描述符顺序分配的非负整数内核用以标识一个特定进程正在访问的文件其他资源(socket、pipe等)的访问标识标准输入、标准输出和标准出错由shell默认打开,分别为0/1/2不用缓冲的I/O通过文件描述符进行访问open()/read()/write()/lseek()/close()…标准I/O通过FILE*进行访问printf()/fprintf()/fopen()/fread()/fwrite()/fseek()/fclose()…
86UNIX-用户标识用户ID(uid)标识不同的用户,用户登录时通过/etc/passwd文件配置通过getuid()可以获取uid每个文件/目录都有相应的owner权限(-rwx)组ID(gid)及添加组ID通过组将多个有用户集中起来进行管理用户登录时通过/etc/passwd文件配置组ID与组名通过/etc/group文件配置每个文件/目录都有相应的group权限(rwx)实际用户ID和有效用户ID实际组ID和有效组ID
87UNIX基础知识-系统调用和库函数系统调用用户空间进程访问内核的接口把用户从底层的硬件编程中解放出来极大的提高了系统的安全性使用户程序具有可移植性库函数库函数为了实现某个功能而封装起来的API集合提供统一的编程接口,更加便于应用程序的移植系统调用与库函数的比较所有的操作系统都提供多种服务的入口点,通过这些入口点,程序向内核请求服务从执行者的角度来看,系统调用和库函数之间有重大的区别,但从用户的角度来看,其区别并不非常的重要。应用程序可以调用系统调用或者库函数,库函数则会调用系统调用来完成其功能。系统调用通常提供一个访问系统的最小界面,而库函数通常提供比较复杂的功能。
88文件I/O–open()/creat()调用open()/creat()函数可以打开或者创建一个文件。open()和creat()调用成功返回文件描述符,失败返回-1,并设置errno。open()/creat()调用返回的文件描述符一定是最小的未用描述符数字。creat()等价于open(pathname,O_CREAT|O_WRONLY|O_TRUNC,mode)open()可以打开设备文件,但是不能创建设备文件,设备文件必须使用mknod()创建。
89文件I/O–open()原型intopen(constchar*pathname,intflags,mode_tmode);参数pathname被打开的文件名(可包括路径名)。flagsO_RDONLY:只读方式打开文件。这三个参数互斥O_WRONLY:可写方式打开文件。O_RDWR:读写方式打开文件。O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三的参数为其设置权限。O_EXCL:如果使用O_CREAT时文件存在,则可返回错误消息。这一参数可测试文件是否存在。O_NOCTTY:使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端。O_TRUNC:如文件已经存在,并且以只读或只写成功打开,那么先全部删除文件中原有数据。O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾。mode被打开文件的存取权限,为8进制表示法。
90文件I/O–close()调用close()函数可以关闭一个打开的文件。调用成功返回0,出错返回-1,并设置errno。当一个进程终止时,该进程打开的所有文件都由内核自动关闭。关闭一个文件的同时,也释放该进程加在该文件上的所有记录锁。
91文件I/O–read()调用read()函数可以从一个已打开的可读文件中读取数据。read()调用成功返回读取的字节数,如果返回0,表示到达文件末尾,如果返回-1,表示出错,通过errno设置错误码。读操作从文件的当前位移量处开始,在成功返回之前,该位移量增加实际读取的字节数。buf参数需要由调用者来分配内存,并在使用后,由调用者释放分配的内存。
92文件I/O–write()调用write()函数可以向一个已打开的可写文件中写入数据。write()调用成功返回已写的字节数,失败返回-1,并设置errno。write()的返回值通常与count不同,因此需要循环将全部待写的数据全部写入文件。write()出错的常见原因:磁盘已满或者超过了一个给定进程的文件长度限制。对于普通文件,写操作从文件的当前位移量处开始,如果在打开文件时,指定了O_APPEND参数,则每次写操作前,将文件位移量设置在文件的当前结尾处,在一次成功的写操作后,该文件的位移量增加实际写的字节数。
93文件I/O–lseek()调用lseek()函数可以显示的定位一个已打开的文件。原型off_tlseek(intfd,off_toffset,intwhence);参数fd:文件描述符。offset:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移)whence(当前位置基点):SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小。SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。返回值成功:文件的当前位移-1:出错94文件与目录操作
951.1.1stat()/fstat()/lstat()三个函数的返回:若成功则为0,若出错则为-1,并且设置errno.给定一个pathname的情况下:stat函数返回一个与此命名文件有关的信息结构fstat函数获得已在描述符filedes上打开的文件的有关信息lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。以下三个函数可以获取文件/目录的属性信息:
961.1.2stat()/fstat()/lstat()–structstatstructstat定义:
971.3设置-用户-ID和设置-组-ID与一个进程相关联的ID有六个或更多实际用户ID和实际组ID标识我们究竟是谁。这两个字段在登录时取自口令文件中的登录项。通常,在一个登录会话期间这些值并不改变,但是超级用户进程有方法改变它们(可以用setuid()函数设置实际用户ID和有效用户ID)。有效用户ID、有效组ID以及添加组ID决定了我们的文件访问权。保存的设置-用户-ID和设置-组-ID在执行一个程序时包含了有效用户ID和有效组ID的副本,在进程控制部分介绍setuid函数时,将说明这两个保存值的作用。
981.3设置-用户-ID和设置-组-ID–进一步的解释(参考)通常,有效用户ID等于实际用户ID,有效组ID等于实际组ID。每个文件有一个所有者和组所有者,所有者由structstat结构中的st_uid表示,组所有者则由st_gid成员表示。当执行一个程序文件时,进程的有效用户ID通常就是实际用户ID,有效组ID通常是实际组ID。但是可以在文件方式字(st_mode)中设置一个特殊标志,其定义是“当执行此文件时,将进程的有效用户ID设置为文件的所有者(st_uid)”。与此相类似,在文件方式字中可以设置另一位,它使得执行此文件的进程的有效组ID设置为文件的组所有者(st_gid)。在文件方式字中的这两位被称之为设置-用户-ID(set-user-ID)位和设置-组-ID(set-group-ID)位。例如,若文件所有者是超级用户,而且设置了该文件的设置-用户-ID位,然后当该程序由一个进程运行时,则该进程具有超级用户优先权。不管执行此文件的进程的实际用户ID是什么,都作这种处理。作为一个例子,UNIX程序passwd(1)允许任一用户改变其口令,该程序是一个设置-用户-ID程序。因为该程序应能将用户的新口令写入口令文件中(一般是/etc/passwd或/etc/shadow),而只有超级用户才具有对该文件的写许可权,所以需要使用设置-用户-ID特征。因为运行设置-用户-ID程序的进程通常得到额外的许可权,所以编写这种程序时要特别谨慎。
991.4文件存取许可权限我们用名字打开任一类型的文件时,对该名字中包含的每一个目录,包括它可能隐含的当前工作目录都应具有执行许可权。对于一个文件的读许可权决定了我们是否能够打开该文件进行读操作。这对应于open函数的O_RDONLY和O_RDWR标志。对于一个文件的写许可权决定了我们是否能够打开该文件进行写操作。这对应于open函数的O_WRONLY和O_RDWR标志。为了在open函数中对一个文件指定O_TRUNC标志,必须对该文件具有写许可权。为了在一个目录中创建一个新文件,必须对该目录具有写许可权和执行许可权。为了删除一个文件,必须对包含该文件的目录具有写许可权和执行许可权。对该文件本身则不需要有读、写许可权。如果用6个exec函数中的任何一个执行某个文件,都必须对该文件具有执行许可权。进程每次打开、创建或删除一个文件时,内核就进行文件存取许可权测试,而这种测试可能涉及文件的所有者(st_uid和st_gid),进程的有效ID(有效用户ID和有效组ID)以及进程的添加组ID(若支持的话)。
1001.5新文件和目录的所有权在使用open()或creat()创建新文件时,或者使用mkdir()创建一个新目录时,新创建的文件/目录的所有权的规则:新文件的用户ID设置为进程的有效用户ID关于组ID,POSIX.1允许选择下列之一作为新文件的组ID:新文件的组ID可以是进程的有效组ID。新文件的组ID可以是它所在目录的组ID。
1011.6.1access()当用open函数打开一个文件时,内核以进程的有效用户ID和有效组ID为基础执行其存取许可权测试。有时,进程也希望按其实际用户ID和实际组ID来测试其存取能力。例如当一个进程使用设置-用户-ID,或设置-组-ID特征作为另一个用户(或组)运行时,这就可能需要测试其存取能力,即使一个进程可能已经设置-用户-ID为根,它仍可能想验证实际用户能否存取一个给定的文件。access()函数是按实际用户ID和实际组ID进行存取许可权测试的。
1021.7umask()umask()函数为进程设置文件方式创建屏蔽字,并返回以前的值。在进程创建一个新文件或新目录时,就一定会使用文件方式创建屏蔽字,在open()/creat()/mkdir()中都有一个参数mode,它指定了新文件的存取许可权位,在文件方式创建屏蔽字中为1的位,在文件mode中的相应位则一定被转成0(即取反码)。新创建的文件或者目录的权限为为permission&~umask。UNIX系统提供的umask命令的作用于umask()函数调用的作用一致。
1031.8.1chmod()/fchmod()以下两个函数使我们可以更改现存文件的存取许可权:UNIX系统提供的chmod命令的作用于chmod()函数调用的作用一致。chmod()函数在指定的文件上进行操作,而fchmod()函数则对已打开的文件进行操作。
1041.8.2chmod()-mode参数(参考)以上参数在<sys/stat.h>头文件中定义。
1051.9chown()/fchown()/lchown()chown()函数可用于更改文件的用户ID和组ID:三个函数返回值:若成功则为0,若出错则为-1三个函数的用途:chown()处理文件名指向的文件fchown()通过文件描述符处理打开的文件lchown()处理符号连接本身除了所引用的文件是符号连接以外,这三个函数的操作相类似。在符号连接情况下,lchown()更改符号连接本身的所有者,而不是该符号连接所指向的文件。
1061.10文件长度structstat结构的成员st_size包含了以字节为单位的该文件的长度。此字段只对普通文件、目录文件和符号连接有意义。对于普通文件,其文件长度可以是0,在读这种文件时,将得到文件结束指示。对于目录,文件长度通常是一个数,例如16或512的整倍数。对于符号连接,文件长度是在文件名中的实际字节数。
1071.13link()/unlink()/remove()/rename()#include<stdio.h>intremove(constchar*path);intstatus;status=remove(“/home/foo/old_mods”);#include<stdio.h>intrename(constchar*old,constchar*new);intstatus;status=rename(“/home/foo/f1”,“/home/foo/f2”);
1081.14opendir()/readdir()和结构体direntstructdirent{chard_name[1]; /*variablelength*/intd_fileno;};109静态库与动态库
什么是库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。linux下的库有两种:静态库和共享库(动态库)。二者的不同点在于代码被载入的时刻不同。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库,因此体积较大。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在,因此代码体积较小。
如何创建静态库创建静态库用ar命令,它将很多.o转换成.a#arcrslibmyhello.ahello.o静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。使用静态链接库#gcc-ohellomain.c-L.-lmyhello
共享库(动态库)动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)。可以实现进程之间的资源共享。将一些程序升级变得简单。甚至可以真正做到链接载入完全由程序员在程序代码中控制。
如何创建共享库我们用gcc来创建共享库#gcc-fPIC-Wall-chello.c#gcc-shared-fPIC-olibmyhello.sohello.o-fPIC创建与地址无关的编译程序
gcc一些参数解析-shared:指定生成动态链接库。-static:指定生成静态链接库。-fPIC:表示编译为位置独立的代码,用于编译共享库。目标文件需要创建成位置无关码,概念上就是在可执行程序装载它们的时候,它们可以放在可执行程序的内存里的任何地方。-L.:表示要连接的库在当前目录中。-l:指定链接时需要的动态库。编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称。-Wall:生成所有警告信息。-ggdb:此选项将尽可能的生成gdb的可以使用的调试信息。-g:编译器在编译的时候产生调试信息。-c:只激活预处理、编译和汇编,也就是把程序做成目标文件(.o文件)。-Wl,options:把参数(options)传递给链接器ld。如果options中间有逗号,就将options分成多个选项,然后传递给链接程序。115进程基本概念进程相关基本概念
什么是进程?UNIX标准把进程定义为:一个其中运行着一个或者多个线程的地址空间和这些线程所需要的系统资源。我们可以把进程看做正在运行的程序。进程是一个程序的一次执行的过程。进程和程序的区别程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念。进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡。进程是资源管理的最小单位线程是系统调度的最小单位116进程与程序指令用户数据系统数据段程序进程进程与程序的关系:程序包含指令和用户数据,当执行一个程序时,系统将程序中的指令和数据加载到内存,作为进程运行的基本材料,但是进程在运行时将会产生诸如CPU的所有寄存器值,以及存储临时数据的进程堆栈等动态信息。117118进程的属性和状态Linux下的进程结构
进程的身份证每一个进程都有一个唯一的身份证号码,称之为进程号PID(ProcessIdentityNumber)每一个进程都有其双亲进程,称之为父进程(或许称为双亲进程更贴切)。通过pstree命令,可以清楚地看到系统中各个进程间的内在关系。所有的进程都是祖先进程init的后代,除了init进程,每一个进程都有一个父进程。在内核中,进程(线程)用结构体task_struct{}来表达。这个结构体通常被称为PCB(ProcessControlBlock),亦即进程控制块,该结构体内包含了一个进程所涉及的所有信息和数据。119120进程的创建,执行和消亡进程状态图
121Linux进程地址空间、用户态和内核态
Linux下的进程管理启动进程手工启动调度启动进程相关命令
124进程相关API传统进程控制API
进程创建fork()
126
fork函数实例127
fork()函数功能图解128
进程回收wait()
129
进程回收waitpid()
130
exec函数族
fork函数用于创建一个子进程,该子进程几乎拷贝了父进程的全部内容。exec函数族提供了一种在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段。在执行完之后,原调用进程的内容除了进程号外,其他全部都被替换了。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。131exec函数族exec函数族对应位的含义
exec函数族使用区别
可执行文件查找方式表中的前四个函数的查找方式都是指定完整的文件目录路径,而最后两个函数(以p结尾的函数)可以只给出文件名,系统会自动从环境变量“$PATH”所包含的路径中进行查找。参数表传递方式两种方式:逐个列举或是将所有参数通过指针数组传递以函数名的第五位字母来区分,字母为“l”(list)的表示逐个列举的方式;字母为“v”(vertor)的表示将所有参数构造成指针数组传递,其语法为char*constargv[]环境变量的使用exec函数族可以默认使用系统的环境变量,也可以传入指定的环境变量。这里,以“e”(Enviromen)结尾的两个函数execle、execve就可以在envp[]中传递当前进程所使用的环境变量133
exec函数族语法
使用的区别可执行文件查找方式参数表传递方式环境变量的使用134
exec使用实例
135要点execl()函数的第一个参数必须是包含了决定路径的可执行程序,第二个参数是要执行的程序名称,且最后参数是NULLexecl()函数将会把所指定的程序覆盖当前程序代码第7行在execl()函数正常执行的情况下被覆盖,无法执行。
exec函数族使用注意点
在使用exec函数族时,一定要加上错误判断语句常见的错误原因有:找不到文件或路径,此时errno被设置为ENOEN数组argv和envp忘记用NULL结束,此时errno被设置为EFAULT没有对应可执行文件的运行权限,此时errno被设置为EACCESS136
exit和_exit137
exit和_exit
138
exit和_exit的区别_exit()函数的作用最为简单:直接使进程终止运行,清除其使用的内存空间,并销毁其在内核中的各种数据结构;exit()函数则在这些基础上作了一些包装,在执行退出之前加了若干道工序。exit()函数在调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是图中的"清理I/O缓冲"一项。139
exit和_exitintmain(void){ printf("Usingexit...\n"); printf("Thisistheend"); exit(0);}[gec@ubuntu]#./a.outUsingexit...Thisistheend[gec@ubuntu]#intmain(void){printf("Using_exit...\n");printf("Thisistheend");_exit(0);}[gec@ubuntu]#./a.outUsing_exit...[gec@ubuntu]#140141守护进程的基本概念
Linux守护进程守护进程,也就是通常所说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是用守护进程实现的。142Linux守护进程在Linux中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会被自动关闭。守护进程能够突破这种限制,它从被执行开始运转,直到整个系统关闭才会退出。如果想让某个进程不因为用户或终端或其他的变化而受到影响,就必须把这个进程变成一个守护进程。143144守护进程的编写进程组,对话期和终端145忽略信号SIGHUP当会话相关的控制终端被关闭时,系统将会发送信号SIGHUP到该会话的所有进程组,包括前后台进程组,默认情况下这些进程组里面的进程都将会被终结。为了防止守护进程在此之前被该信号影响,应先忽略掉这个信号:signal(SIGHUP,SIG_IGN);146用fork产生第一个子进程创建子进程,父进程退出由于守护进程是脱离控制终端的,因此,完成第一步后就会在shell终端里造成一程序已经运行完毕的假象。之后的所有后续工作都在子进程中完成,而用户在Shell终端里则可以执行其他的命令,从而在形式上做到了与控制终端的脱离。由于父进程已经先于子进程退出,会造成子进程没有父进程,从而变成一个孤儿进程。在Linux中,每当系统发现一个孤儿进程,就会自动由1号进程收养。原先的子进程就会变成init进程的子进程。if((pid=fork())<0){fprintf(stderr,“errorinfirstfork.\n”); exit(1);}if(pid>0)/*父进程退出*/{ exit(0);}147148在子进程中创建新会话
进程组进程组是一个或多个进程的集合。进程组由进程组ID来唯一标识。除了进程号(PID)之外,进程组ID也一个进程的必备属性之一。每个进程组都有一个组长进程,组长进程的进程号等于进程组ID。会话期会话组是一个或多个进程组的集合通常一个会话开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期148149
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江苏省医疗卫生系统招聘考试(老医学)历年参考题库含答案详解
- 2026江苏专职消防员招聘考试(消防基础知识)历年参考题库含答案详解
- 2026教师职称考试(数学)历年参考题库含答案详解
- 2026教师职称-甘肃-甘肃教师职称(基础知识、综合素质、高中音乐)历年参考题库含答案详解3套试卷
- 基于PID的电机课程设计方案课程设计
- BLE手环开发与设计课程设计
- 在线教育平台学习习惯分析课程设计
- 社交网络谣言传播治理策略课程设计
- 保护小鸟游戏课程设计
- 生物特征识别系统开发课程课程设计
- 2024秋季部编版小学五年级上册语文核心素养大单元教学全册教案(表格版)
- 赔偿协议书合同
- 非标设备定制合同协议
- 宠物临床检查技术 课件 3临床六大基本检查方法
- 还款计划还款协议书
- 中国卫生经济学会卫生健康经济管理研究课题申请书
- 建筑工程的环境保护
- 工商银行隐私计算技术及应用白皮书 2024
- GB/T 44668-20240岁~6岁视障儿童早期干预机构服务规范
- 2024一儿一女离婚协议书模板
- 农村电子商务运营管理(中职)全套教学课件
评论
0/150
提交评论