作者:秦立春
出版社:电子工业出版社
格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT
嵌入式Linux系统编程试读:
前言
近年来,Linux操作系统使用越来越广泛。而Linux操作系统的使用相比于Windows要困难一些,又由于Linux下没有很好的集成开发环境(IDE),在Linux下进行C语言编程开发比Windows下更不容易。而且在Linux下编程需要用到很多Linux系统API函数,这些函数虽然有完整的帮助文档可以查阅,但由于是英文,讲解太详细太全面,所以内容太多,我们通常没有时间对它们进行详尽的阅读,而且这些帮助文档以参考性的内容为主,这无疑增加了开发人员学习的难度。所以我们确实需要一本通俗易懂的介绍Linux系统下编程的书。本书是一本较为全面系统地介绍Linux下应用程序编程知识的书籍,涵盖了Linux系统下编程绝大多数的API函数及使用示例,足够广大开发人员参考使用。
国内关于讲解Linux系统编程知识的书籍比较少,国外相关著作虽然全面系统,但讲解风格却是依照西方的思维方式,过于专业和深奥,这与中国人的思维方式有些不同,所以我们在阅读那些书时难免会感到不习惯,影响学习。因此,我们需要一本按照国人容易接受的方式去讲解编程知识的参考书。本书讲解清晰易懂,内容科学合理,有助于初学者迅速掌握知识体系和精髓,在学习时间相同的情况下,学习效果也更好。
本书适合广大范围的计算机编程人员学习,只要读者具备一定的C语言编程基础即可。即使没用过Linux系统的人,阅读本书第1章Linux基本命令讲解后,也能对Linux系统有相当的了解和熟悉。然后讲述了Linux下程序编译和调试的基本知识,如gcc、gdb的用法,Makefile的编写规则,这两章算是基础入门知识,接下来后面的章节都是介绍Linux下的API函数及其示例用法,程序都是精心设计的,一针见血地表达出了重点。API函数部分包括Linux文件目录操作、基于文件指针和基于文件描述符的文件操作函数、多进程的控制、Linux下信号处理、各种进程间通信方式的讲解、多线程编程、线程同步与互斥,以及网络Socket编程这些内容。
本书内容涵盖面广,知识点全面,语言简练而清晰,能让读者迅速掌握精髓,也很适合自学。初学者和专业开发人员都能从中受益匪浅。
本书由深圳信盈达电子有限公司秦立春、周中孝编著,在此向他们表示衷心的感谢。另外,感谢电子工业出版社,是他们认真专业的审核,让本书由粗糙的初稿变成了精美的图书。
由于时间仓促,编者水平有限,书中难免有不恰当的地方,希望广大读者批评指正,联系邮箱:niusdw@163.com,欢迎来信交流。编著者2014年2月27第1章Linux基础知识1.1 Linux的历史
操作系统始于20世纪50年代。1991年,一个计算机爱好者在Minix(一个功能很有限的类似于UNIX的操作系统)的基础上开发出一款操作系统,叫Linux。最初的Linux作用并不大,但是很多人开始对Linux感兴趣,共同开发它,使Linux变成了一个很有用的操作系统,但此时它的功能仍然不够好。
为创建一套完全自由的操作系统,有人发起了GNU计划。GNU计划又称革奴计划,它可以让任何人自由地使用、复制、修改和发布GNU软件。GNU软件都遵守GPL协议(GNU General Public License,GNU通用开源许可证),或称“反版权”协议。在该计划的促进下,开发人员开发出了功能得到极大改善的新的Linux操作系统,于是Linux开始流行起来。GNU对Linux的贡献非常大。
Linux本身只是操作系统的内核,后来才添加进许多应用功能。内核非常重要,它是其他程序能够运行的基础。实际上,用户或者系统管理员运行的所有程序都运行在内核之上。
为什么要用Linux操作系统而不用Windows?Linux操作系统相比于Windows的优点包括:● 开源和完全免费,这是其他操作系统做不到的;● 支持多种平台,Linux可运行在多种硬件的处理器平台上;● 最突出的是它可以很好地运行在嵌入式产品上,如掌上电脑、机
顶盒、游戏机等;● Linux系统很安全,针对Linux的病毒很少。
Linux也有缺点:可扩展性不强;缺乏硬件集成/支持;缺乏洞察力等。1.2 Linux目录结构
/bin:该目录中存放Linux的常用命令,在有的版本中是一些和根目录下相同的目录。
/boot:该目录下存放的都是系统启动时要用到的程序,当用lilo引导Linux时,会用到这里的一些信息。
/dev:该目录包含了Linux系统中使用的所有外部设备,它实际上是访问这些外部设备的端口,可以访问这些外部设备,与访问一个文件或一个目录没有区别。例如,在系统中输入“cd/dev/cdrom”,就可以看到光驱中的文件;输入“cd/dev/mouse”,即可看到与鼠标相关的文件。
/etc:该目录存放了系统管理时要用到的各种配置文件和子目录,如网络配置文件、文件系统、X系统配置文件、设备配置信息、设置用户信息等。
/sbin:该目录用来存放系统管理员的系统管理程序。
/home:如果建立一个名为“xx”的用户,那么在/home目录下就有一个对应“/home/xx”的路径,用来存放该用户的主目录。
/lib:该目录用来存放系统动态链接共享库,几乎所有的应用程序都会用到该目录下的共享库。
/lost+found:该目录在大多数情况下都是空的;但当突然停电或者非正常关机后,有些文件就临时存放在这里。
/mnt:该目录在一般情况下也是空的,可以临时将别的文件系统挂在该目录下。
/proc:可以在该目录下获取系统信息,这些信息是在内存中由系统自己产生的。
/root:如果你是以超级用户的身份登录的,这个就是超级用户的主目录。
/tmp:用来存放不同程序执行时所产生的临时文件。
/usr:用户的很多应用程序和文件都存放在该目录下。例如:● /usr/X11R6:X-Window目录;● /usr/src:Linux源代码;● /usr/include:系统头文件;● /usr/lib:存放常用的动态链接共享库和静态档案库。1.3 Linux常用命令
Linux下的两种账号:● root——超级用户账号(系统管理员),使用这个账号可以在系
统中做任何事情;● 普通用户——供普通用户使用,可以进行有限的操作。
用户正确地输入用户名和口令后,就能合法地进入系统,屏幕显示“[root@loclhost/root]#”。
这时可以对系统做各种操作。注意超级用户的提示符是“#”,其他用户的提示符是“$”。利用whoami可以知道当前登录的用户账号是什么身份。
用exit或logout结束当前的Linux会话,也可按下〈CTRL〉+d来结束Linux会话。1.3.1 su(用户切换)
功能:切换用户。
语法:su[用户名] 注:“[]”表示可选)
说明:su命令是最基本的命令之一,常用于不同用户间切换。例如:如果登录为user1,要切换为user2,只要用命令“$su user2”;然后系统提示输入user2口令,输入正确的口令之后就可以切换到user2;完成之后可以用exit命令返回到user1。
su命令的常见用法是变成根用户或超级用户。如果普通用户发出不带用户名的su命令,则系统提示输入根口令,输入之后即可切换为根用户。
如果登录为根用户,则可以用su命令切换为系统上任何用户而不需要口令。1.3.2 useradd(添加用户)
功能:添加用户。
语法:useradd用户名
说明:useradd可以用来建立用户账号。账号建好之后,再用passwd设定账号的密码。而可用userdel删除账号。使用useradd指令所建立的账号,实际上保存在“/etc/passwd”文本文件中。每建立一个用户,就在“/home”目录下建立一个主目录。
该命令必须有系统管理员权限才能执行。
常用选项:-d指定目录,-m指定权限,-g为组号(把用户加入到具体的组)。
利用id可以查看用户信息组号,id lry可以查看lry用户的组信息。1.3.3 passwd(修改密码)
功能:添加密码和修改密码。
语法:passwd[用户名]。
说明:出于系统安全的考虑,Linux系统中的每一个用户除了有其用户名外,还有其对应的用户密码。因此,在使用useradd命令添加用户时,还需使用passwd命令为每一位新添加的用户设置密码;用户以后还可以随时用passwd命令修改自己的密码。
该命令的一般格式为:passwd[用户名]。其中用户名为需要修改密码的用户名。只有超级用户可以使用“passwd用户名”修改其他用户的密码,普通用户只能用不带参数的passwd命令修改自己的密码。
利用passwd命令修改自身密码的方法如下:● 输入“:passwd”
个密码);● 系统提示再次输入这个新密码。
输入正确后,这个新密码被加密并放入“/etc/shadow”文件。选取一个不易被破译的密码是很重要的,选取密码应遵守如下规则:● 密码应该至少有6位(最好是8位)字符;● 密码应该是大小写字母、标点符号和数字混杂的。
超级用户修改其他用户(xxq)的密码的过程如下:# passwd xxqNew LINUX password:Retype new LINUX password:passwd: all authentication tokens updated successfully1.3.4 进程相关(系统管理)命令
ps命令:类似于任务管理器,ps为我们提供了一次性查看进程的方法。ps命令所提供的查看结果并不是动态连续的;如果想对进程实时监控,应该用top工具。ps常用形式为ps-aux和ps-ef。
执行ps-aux之后结果如下:
…
该命令的参数如下:● USER:进程的属主;● PID:进程的ID(是唯一的数值,用来区分进程);● PPID:父进程;● %CPU:进程占用的CPU百分比;● %MEM:占用内存的百分比;● NI:进程的NICE值,数值大,表示较少占用CPU时间;● VSZ:进程的虚拟大小;● RSS:驻留中页的数量;● TTY:终端ID;● WCHAN:正在等待的进程资源;● stat:进程状态[运行R、休眠S、僵尸Z、停止或被追踪T、死掉
的进程X、优先级较低的进程N、优先级高的进程<、进入内存交
换W、非中断休眠(常规IO)D];● START:启动进程的时间;● TIME:进程消耗CPU的时间;● COMMAND:命令的名称和参数。
kill命令:通常与ps命令一起使用,常用的形式是“kill-9进程ID”(表示向指定的进程ID发送SIGKILL的信号,其中-9表示强制终止,可以省略,它是信号代码,可以利用kill-l列出所有信号),另一种形式是“pkill进程名字”(可以直接杀死指定进程名的进程)。
top命令:和ps相比,top是动态监视系统任务的工具,top输出的结果是连续的,比如#top。
jobs命令:观察后台进程。1.3.5 磁盘相关命令(fdisk)
fdisk命令可以查看硬盘分区情况,并可用于对硬盘分区进行管理以及给硬盘分区等。其常用功能是查看U盘状况,比如fdisk-l。1.3.6 pwd(显示工作目录)
功能:在Linux层次目录结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用户目前处于哪一个目录中。要想知道当前所处的目录,可以使用pwd命令,该命令显示整个路径名。
语法:pwd
说明:此命令显示出当前工作目录的绝对路径。
举例:pwd
根目录以开头的“/”表示。如果pwd后面什么都没有,则显示当前所在位置;如果屏幕信息很多,用clear命令可以清除。1.3.7 cd(改变工作目录)
功能:改变工作目录。工作目录是当前左边的信息所显示的目录。
语法:cd[dirname]
说明:该命令将当前工作目录切换至dirname所指定的目录。若没有指定dirname,则回到用户的主目录。为了改变为指定目录,用户必须拥有对指定目录的执行权限和读权限。
该命令也可以使用通配符。例如,假设用户当前目录是/home/lry,现需要更换到/home/lry/Linux目录中:
$cdLinux
此时,用户可以执行pwd命令来显示工作目录(相对路径的形式):
$pwd/home/lry/Linux (绝对路径的形式)
用法:cd..到父目录,即上一级目录,相当于“向上”cd-到上一次目录,相当于“后退”cd/到根目录cd~(或者只写到用户主目录下“cd”)1.3.8 ls(查看文件/目录)
功能:ls是英文“list”的简写,其功能为列出目录的内容。这是用户最常用的一个命令之一,因为用户需要不时地查看某个目录的内容。该命令类似于DOS下的dir命令。
语法:ls [选项][目录或是文件]
说明:对于每一个目录,该命令将列出其中的所有子目录与文件。对于每个文件,ls将输出其文件名以及所要求的其他信息。默认情况下,输出条目按字母顺序排序。当未给出目录名或文件名时,就显示当前目录的信息。注意,Linux文件系统不是根据后缀来执行文件的,而是根据此文件有没有执行权限来执行文件的。
常用参数:
-a 显示指定目录下所有子目录与文件,包括隐藏文件。
-A 显示指定目录下所有子目录与文件,包括隐藏文件,但不列出“.”和“..”。
-i 在输出的第一列显示文件的i节点号。
-l 以长格式来显示文件的详细信息。这个选项最常用。
-d 列出目录本身。
-p 在目录后面加一个“/”。
-R 递归式地显示指定目录的各个子目录中的文件。
以-l长格式显示文件的详细时,每行列出的信息依次是:文件类型与权限,链接数,文件所有者,文件属组,文件大小,最近修改的时间,名字。
对于符号链接文件,显示的文件名之后有“—〉”和引用文件路径名。
对于设备文件,其“文件大小”字段显示主、次设备号,而不是文件大小。
目录中的总块数显示在长格式列表的开头,其中包含间接块。
在用ls-l命令显示的信息中,开头是由10个字符构成的字符串,其中第一个字符表示文件类型,它可以是下述类型之一:● 普通文件;● 目录(d);● 符号链接(l);● 块设备文件(b);● 字符设备文件(c);● 命名管道(p);● socket文件(s)。
后面的9个字符表示文件的访问权限,分为3组,每组3位。第一组表示文件所有者的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字符分别表示对文件的读、写和执行权限。各权限如下:4r(读)2w(写)x(执行)1(对于目录,表示进入权限)-没有设置权限。
另外,ls输出内容是有颜色的,比如:目录是蓝色的,压缩文件是红色的。如果没有颜色,可以加上参数“color=never”表示输出没有彩色,而“color=auto”表示自动,“color=always”表示始终有颜色。
通配符在ls命令中的应用:
* 代表0个或多个字符
[] 表示内部包括任何字符
? 表示任何单个字符
如果需要更加详细的参数描述,可以通过如下3种方式获得ls的帮助:● ls—help● man ls● info ls1.3.9 mkdir(创建目录)
功能:创建一个目录
语法:mkdir[选项]dirname
说明:该命令创建由dirname命名的目录。要求创建目录的用户在当前目录中(dirname的父目录中)具有写权限,并且dirname不能是当前目录中已有的目录或文件名称。
参数:-m对新建目录设置存取权限。也可以用chmod命令设置。-p可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。1.3.10 cp(文件/目录复制)
功能:将给出的文件或目录复制到另一文件或目录中。
语法:cp[选项]源文件或目录 目标文件或目录
说明:该命令把指定的源文件复制到目标文件,或者把多个源文件复制到目标目录中。
参数:-a该选项通常在复制目录时使用。它保留链接、文件属性,并递归地复制目录。-d复制时保留链接。-f删除已经存在的目标文件而不提示。-i和f选项相反,在覆盖目标文件之前给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式复制。-r若给出的源文件是一个目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
要说明的是,为了防止用户在不经意的情况下用cp命令破坏另一个文件(如用户指定的目标文件名是一个已存在的文件名,用cp命令复制文件后,这个文件就会被新复制的源文件覆盖),建议用户在使用cp命令复制文件时,最好使用i选项,如下所示:$cp-ia.txt/home/b.txt
该命令将文件a.txt复制到“/home”这个目录下,并改名为“b.txt”。若不希望重新命名,可以使用下面的命令:$cpa.txt/home$cp-r/home/lry/root
该命令将/home/lry目录中的所有文件及其子目录复制到目录/root中。1.3.11 mv(文件/目录改名、移动)
功能:为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同DOS下ren和move的组合。
语法:mv[选项]源文件或目录 目标文件或目录
说明:视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名,此时源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先复制,再将原有文件删除,而与该文件的链接也将丢失。
参数:-i交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,则系统询问是否重写,要求用户回答y或n,这样可以避免误覆盖文件。-f禁止交互操作。在mv操作要覆盖某个已有的目标文件时不给任何指示;指定此选项后,i选项将不再起作用。
如果所给目标文件(不是目录)已存在,此时该文件的内容将被新文件覆盖。为防止用户在不经意的情况下用mv命令破坏另一个文件,建议用户在使用mv命令移动文件时,最好使用i选项。
需要注意的是,mv与cp的结果不同。mv好像文件“搬家”,文件个数并末增加,而cp对文件进行复制,文件个数增加了。
示例:
① 将/lry中的所有文件移到当前目录(用“.”表示)中:$mv/home/lry/*.
② 将文件a.txt重命名为b.txt:$mva.txt b.txt1.3.12 rm(文件/目录删除)
功能:在Linux中创建文件很容易,系统中随时会有文件过时且毫无用处。用户可以用rm命令将其删除。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录和其下的所有文件及子目录均删除。对于链接文件,只是删除链接,原有文件均保持不变。
语法:rm[选项]文件…
说明:如果没有使用-r选项,则rm不会删除目录。
参数:
-f 忽略不存在的文件,从不给出提示;
-r 指示rm将参数中列出的全部目录和子目录均递归地删除;
-i 进行交互式删除。
使用rm命令要格外小心;因为一旦一个文件被删除,它是不能被恢复的。例如,用户在输入cp、mv或其他命令时,不小心误输入了rm命令,当该用户按了回车键并认识到自己的错误时,已经太晚了,文件已经没有了。为了防止这种情况的发生,可以使用rm命令中的i选项来确认要删除的每个文件:如果用户输入y,文件将被删除;如果输入任何其他内容,文件将被保留。1.3.13 cat(查看文件内容)
功能:查看文件内容。
语法:cat[选项][文件]
参数:
-b 对非空输出行编号;
-E 在每行结束处显示“$”;
-n 对输出的所有行编号;
-s 不输出多行空行。
cat常常与重定向一起使用。
重定向符号:“<”重定向输入“>”重定向输出“>>”添加输出“2>”错误重定向“&>”错误和信息重定向
如果cat的命令行中没有参数,它就会从标准输入中读取数据,并将其送到标准输出。
标准输入:一般指键盘,描述符为:0
标准输出:一般指屏幕输出,描述符为:1
错误输出:也是屏幕,描述符为:2
标准的输入输出与重定向:
其中“>”表示创建,“>>”表示追加,“<<”表示以什么结束
Linux中创建空文件的4种方式:
方式1:[root@localhost ~]# echo>a.txt或直接>a.txt
方式2:[root@localhost ~]# touch b.txt
方式3:[root@localhost ~]# cat>c.txt然后按ctrl+c组合键退出,或Ctrl+d;
方式4:[root@localhost ~]# vi d.txt进入之后,wq退出。1.3.14 more(分页显示文件内容)
功能:显示文件的内容,然后根据窗口大小进行分页显示。
语法:more[参数选项]文件
说明:非常大的文本要用more来查看,more具有分页显示功能。
参数:+num从第num行开始显示;-num定义屏幕的大小,为num行;+/pattern从pattern前两行开始显示;-c从顶部清屏,然后显示;-d提示“Press space to continue, 'q' to quit.”(按空格键继续,按q键退出),禁用响铃功能;-s把连续的多个空行显示为一行;-u把文件内容中的下划线去掉。
示例:[root@localhost ~]# 注:显示提示,并从终端或控制台顶more-dc/etc/profile部显示;[root@localhost ~]# 注:从profile的第4行开始显示;more+4/etc/profile[root@localhost ~]# 注:每屏显示4行;more-4/etc/profile[root@localhost ~]# 注:从profile中的第一个MAIL单词的前more+/MAIL/etc/profile两行开始显示。
进入more之后,需要的more的动作指令如下:
查看一个内容较大的文件时,要用到more的动作指令:“f”(或空格键)是向下显示一屏,Enter键可以向下滚动显示1行。“=”输出当前行的行号;进入more环境后,退出more的动作指令是“q”。
一般more都和管道结合起来使用。我们列一个目录下的文件,由于内容太多,可以用more来分页显示。这要和管道()结合起来。
管道:将一个程序或命令的输出作为另一个程序或命令的输入。
比如:[root@localhost ~]# ls-l/etcmore1.3.15 less(分页显示文件内容)
功能:less工具也是对文件或其他输出进行分页显示的工具,是Linux正统查看文件内容的工具,功能极其强大;
语法:less[参数]文件
常用参数:-c从顶部(从上到下)刷新屏幕,并显示文件内容,而不是通过底部滚动完成刷新;-f强制打开文件,二进制文件显示时,不提示警告;-i搜索时忽略大小写;除非搜索串中包含大写字母;-I搜索时忽略大小写,除非搜索串中包含小写字母;-m显示读取文件的百分比;-M显法读取文件的百分比、行号及总行数;-N在每行前输出行号;-ppattern搜索pattern,比如在/etc/profile搜索单词MAIL,就用less-p MAIL/etc/profile;-s把连续多个空白行作为一个空白行显示;-Q在终端下不响铃。
less的动作命令:回车键向下移动一行;y向上移动一行;f或空格键向下滚动一屏;b向上滚动一屏;d向下滚动半屏;hless的帮助;u向上滚动半屏;w可以指定从哪行开始显示,是从指定数字的下一行显示,比如指定的是6,那就从第7行显示;g跳到第一行;G跳到最后一行;p跳到n%,比如20%即从整个文件内容的20%处开始显示;/pattern搜索pattern,比如“/MAIL”表示在文件中搜索“MAIL”;q退出less。1.3.16 管道与命令替换
管道是重定向的一种,就像一个导管一样,将一个程序或命令的输出作为另一个程序或命令的输入,例如:#ls-l/etcwc-w。
命令替换和重定向有点相似,但区别在于命令替换是将一个命令的输出作为另一个命令的参数。常用的格式为:command1、command2或command1$(command2)。
示例:
首先列出当前的所有信息,并重定向到a.txt文件中:
#lscat>a.txt或ls>a.txt
然后,通过命令替换,列出a.txt文件中所有的文件信息:
#ls-l ′cat a.txt′或者用ls-l$(cat a.txt)1.3.17 umask(文件/目录创建掩码)
在创建umask指文件(0666)或目录(0777)时要从全部权限中去掉的一些权限。umask的默认值,普通用户为002,超级用户为022;002表示创建目录时所有者的权限不去掉,所属组权限不去掉,其他组权限的写属性去掉。
创建一个文件以后,普通用户默认的权限为664,超级用户默认的权限为644。
创建一个目录以后,普通用户默认的权限为775,超级用户默认的权限为755。
可以通过“#umask”查看默认的掩码值,通过“#umask 001”修改掩码值。1.3.18 chgrp(改变文件/目录所属的组)
功能:改变文件或目录所属的组。
语法:chgrp[选项]group filename
说明:该命令改变指定文件所属的用户组。其中group可以是用户组ID(可通过id lry查看),也可以是/etc/group文件中用户组的组名。文件名是以空格分开的要改变属组的文件列表,支持通配符。如果用户不是该文件的所有者或超级用户,则不能改变该文件的组。
参数:
-R 递归式地改变指定目录及其下的所有子目录和文件的属组。
示例:$chgrp-R lry/opt/local/book
改变/opt/local/book/及其子目录下的所有文件的属组为lry。1.3.19 chown(更改某个文件/目录的所有者和属组)
功能:更改某个文件或目录的所有者和属组。这个命令也很常用。例如,root用户把自己的一个文件复制给用户lry,为了让用户lry能够存取这个文件,root用户应该把这个文件的所有者设为lry,否则用户lry无法存取这个文件。
语法:chown[选项]用户或组文件
说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户ID。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。
参数:
-R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。
-v 显示chown命令所做的工作。
示例:
① 把文件a.txt的所有者改为lry。$chown lry a.txt
② 把目录“/his”及其下的所有文件和子目录的所有者改成lry,属组改成users。
$chown-Rlry.users/his 或 $chown-R lry:users/his1.3.20 chmod(修改文件权限)
chmod数字文件(夹):修改文件(夹)的权限。最常用、最简便的用法是“chmod 777文件(夹)”。此命令经常用到。如果出现权限不允许、可执行文件不能执行,以及文件夹不能访问等情况,则需要执行“chmod 777文件(夹)”来解决。
功能:chmod命令是非常重要的,用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。
语法:该命令有两种用法:一种是包含字母和操作符表达式的文字设定法;另一种是包含数字的数字设定法。
说明:我们利用ls-l长格式列出文件或目录的基本信息如下:文件类型与权限 链接数 文件所有者 文件属组 文件大小 最近修改的时间 名字
对于权限,第一组表示文件所有者的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字符分别表示对文件的读、写和执行权限。可以通过chmod来修改权限。
1. 文字设定法
chmod[who][+-=][mode]文件名//修改指定文件名中who的权限增加/去除/赋值为mode
参数:
操作对象who可以是下述字母中的任一个或者它们的组合:
u 表示“用户(user)”,即文件或目录的所有者。
g 表示“同组(group)用户”,即与文件所有者有相同组ID的所有用户。
o 表示“其他(others)用户”。
a 表示“所有(all)用户”。它是系统默认值,即chmod+x 1.c表示所有人都有可执行的权限。
操作符号可以是:
+ 添加某个权限;
- 取消某个权限;
= 赋予给定权限并取消其他所有权限(如果有的话)。
设置mode所表示的权限可用下述字母的任意组合:
r 可读;
w 可写;
x 可执行。
当是组合的时候,前面的who要指明。
文件名以空格分开的,要改变权限的文件列表,支持通配符。
在一个命令行中可以给出多个权限方式,其间用逗号隔开。例如,“chmod g+r,o+r示例:”使同组和其他用户对文件“示例:”有读权限。
示例:
① $chmod a+x sort
该命令设定文件sort的属性为:文件所有者(u)、与文件所有者同组用户(g)、其他用户(o)均增加执行权限。
② $chmod ug+w,o-x text
该命令设定文件text的属性为:文件所有者(u)增加写权限,与文件所有者同组用户(g)增加写权限,其他用户(o)删除执行权限。
③ $chmod a-x a.txt
$chmod-x a.txt
$chmod ugo-x a.txt
以上这三个命令都是将文件a.txt的执行权限删除,它设定的对象为所有使用者。
2. 数字设定法
首先应了解用数字表示的属性的含义:0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,然后将其相加。所以,数字属性的格式应为3个从0到7的八进制数,其顺序是(u)(g)(o)。
例如,如果想让某个文件的所有者有“读/写”二种权限,需要把4(可读)+2(可写)=6(读/写)。
数字设定法的一般形式为:
chmod[mode]文件名
示例:
① $chmod 644 a.txt
$ls-l
上述命令设定文件a.txt的属性为:
-rwxr-x--- 1lry users 30128 Dec 15 10:52 a.txt
文件所有者(u)lry拥有读、写权限,与文件所有者同组人用户(g)拥有读权限,其他人(o)拥有读权限。
② $chmod 750 a.txt
$ls-l
-rwxr-x--- 1lry users 30128 Dec 15 10:52 a.txt
上述命令设定a.txt这个文件的属性为:文件主本人(u)lry有可读/可写/可执行权,与文件主同组人(g)有可读/可执行权,其他人(o)没有任何权限。1.3.21 find(文件查找)
功能:在目录结构中搜索文件,并执行指定的操作。
语法:find 起始目录 寻找条件 操作
说明:find命令从指定的起始目录开始,递归地搜索其各个子目录,查找满足寻找条件的文件并对其采取相关的操作。
该命令提供的寻找条件可以是一个用逻辑运算符not、and、or组成的复合条件。逻辑运算符and、or、not的含义为:
and(逻辑与)在命令中用“-a”表示,是系统默认的选项,表示只有当所给的条件都满足时,寻找条件才算满足。例如:$find/Linux-name a.txt-type d -user root
该命令寻找三个给定条件都满足的所有文件。
or(逻辑或)在命令中用“-o”表示。该运算符表示只要所给的条件中有一个满足时,寻找条件就算满足。例如:$find/Linux-name a.txt-o-name b.txt
该命令在路径“/Linux”下查询文件名为“a.txt”或是匹配“b.txt”的所有文件。可以使用通配符,此时需要用“ ”引起来。
not(逻辑非)在命令中用“!”表示。该运算符表示查找不满足所给条件的文件。例如:$find/Linux !-name a.txt
该命令在路径“/Linux”下查询文件名不是“a.txt”的所有文件。
1. 以名称和文件属性查找
-name′字串′ 查找文件名与所给字串匹配的所有文件,字串内可用通配符“*”、“?”、“[]”。
-gid n 查找属于ID号为n的用户组的所有文件。
-uid n 查找属于ID号为n的用户的所有文件。
-group′字串′ 查找属于用户组名为所给字串的所有文件。
-user′字串′ 查找属于用户名为所给字串的所有文件。
-empty 查找大小为0的目录或文件。
-perm权限 查找具有指定权限的文件和目录,权限的表示可以如711,644。
-size n[bckw] 查找指定文件大小的文件,“n”后面的字符表示单位,默认为b,代表512字节的块。
-type x 查找类型为x的文件,其中x为下列字符之一:
b 块设备文件;
c 字符设备文件;
d 目录文件;
p 命名管道(FIFO);
f 普通文件;
l 符号链接文件(symbolic links);
s socket文件。
2. 以时间为条件查找
-amin n 查找n分钟以前被访问过的所有文件。“+”表示n分钟之前,-(或者不写)表示n分钟之内)。
-cmin n 查找n分钟以前文件状态被修改过的所有文件。
-mmin n 查找n分钟以前文件内容被修改过的所有文件。
-atime n 查找n天以前被访问过的所有文件。
-ctime n 查找n天以前文件状态被修改过的所有文件。
-mtime n 查找n天以前文件内容被修改过的所有文件。
3. 可执行的操作
-exec命令名称{} 对符合条件的文件执行所给的Linux命令,而不询问用户是否需要执行该命令。其中{}表示命令的参数即为所找到的文件,命令的末尾必须以“\;”结束。
-ok命令名称{} 对符合条件的文件执行所给的Linux命令。与exec命令不同的是,它会询问用户是否需要执行该命令。
-ls 详细列出所找到的所有文件。
-fprintf 文件名 将找到的文件名写入指定文件。
-print 在标准输出设备上显示查找出的文件名。
-printf格式 格式的写法请参考有关C语言的书。
示例:
① 查找当前目录中所有以a开头的文件,并显示这些文件的内容。$find .-name‘a*’-exec more {}\;
② 删除当前目录下所有一周之内没有被访问过的a txt或*.c文件。$find.\(-name a.txt-o-name *.c\)\>-atime+7-exec rm {}\;
说明:命令中的“.”表示当前目录,此时find将从当前目录开始,逐个在其子目录中查找满足后面指定条件的文件。“-name a.txt”是指要查找名为“a.txt”的文件;“-name *.c”是指要查找所有名字以“.c”结尾的文件。这两个“-name”之间的“-o”表示逻辑或(or),即查找名字为“a.txt”或名字以“.c”结尾的文件,并且需要用“()”括起来,对于“()”而言,需要采用\(和\)的形式并且要跟后面的“-name”用空格隔开。find在当前目录及其子目录下找到这佯的文件之后,再进行判断,看其最后访问时间是否在7天以前(条件-atime+7);若是,则对该文件执行命令rm(-exec rm-rf{}\;)。其中“{}”代表当前查到的符合条件的文件名,“\;”则是语法所要求的。上述命令中第一行的最后一个“\”是续行符。当命令太长在一行写不下时,可输入一个“\”,之后系统将显示一个“>”,指示用户继续输入命令。如果一行写完,则是:find ./ \(-name a.txt-o-name *.c\)-atime+7-exec rm-rf {}\;
另外,对于basename和dirname这两个命令:basename/home/lry 输出:lrydirname/home/lry 输出:/home1.3.22 locate(快速文件查找)
功能:locate命令用于查找文件,它比find命令的搜索速度快,但需要一个数据库,这个数据库由每天的例行工作(crontab)程序来建立。当我们建立好这个数据库后,就可以方便地来搜寻所需的文件了。locate的应用,首先要通过updatedb建立索引数据库,然后才能应用;如果新安装了软件或者存放了新的文件,也要先运行updatedb命令,以生成最新索引库。
语法:locate相关字
示例:查找相关字“issue”。[root@localhost ~]#locate issue/etc/issue/etc/issue.net/usr/man/man5/issue.net.5
记得在搜索之前先运行updatedb更新索引数据库,以保证数据准确:[root@localhost ~]#updatedb1.3.23 ln(建立符号链接)
ln的功能是链接文件或目录,分为软链接和硬链接。
软链接语法:ln-s 源文件 目标文件(删除源文件之后,链接变成无效的了),相当于快捷方式。
硬链接语法:ln 源文件 目标文件(删除源文件之后,目标没有影响)
先通过#ln-sa.txt p创建软链接,然后用ls命令查看,就可以看到p带有一个箭头指向a.txt。1.3.24 whereis和which(查找命令所在目录)
1. whereis
功能:查找系统文件的源、二进制文件和手册帮助信息等各部分。
语法:whereis命令
示例:我们不知道fdisk工具放在哪里,就可以用whereis fdisk来查找:[root@localhost ~]# whereis fdiskfdisk:/sbin/fdisk/usr/share/man/man8/fdisk.8.gz
说明:fdisk位于“/sbin”目录下,它的帮助文件是“fdisk.8.gz”。
2. which
功能:在环境变量中设置好的路径中寻找命令(或可执行程序),路径的环境变量是PATH,可以通过echo $PATH查看系统设定的环境变量。
语法:which命令
示例:我们不知道fdisk工具放在哪里,就可以用which fdisk来查找:[root@localhost ~]# which fdisk/sbin/fdisk1.3.25 grep(搜索文件内容)
功能:grep过滤器查找指定字符模式的文件,并显示含有此模式的所有行。被寻找的模式称为正则表达式。其中,过滤器是一个程序,它接受来自标准输入文件的输入,处理(过滤)它,然后再将它的输出发送到标准输出文件。正则表达式本身就是一个小型的编程语言,即perl语言,常与Linux结合使用。常用的一些正则表达式如表1.1所示。表1.1 常用的正则表达式
语法:grep[选项][查找模式][文件名1,文件名2,…]
参数:
-E 每个模式作为一个扩展的正则表达式对待。
-F 每个模式作为一组固定字符串对待(以新行分隔),而不作为正则表达式。
-c 只显示匹配行的数量。
-i 比较时不区分大小写。
-l 显示首次匹配串所在的文件名,并用换行符将其隔开。当在某文件中多次出现匹配串时,不重复显示此文件名。
-n 在输出前加上匹配串所在行的行号(文件首行行号为1)。
-v 只显示不包含匹配串的行。
-x 只显示整行严格匹配的行。
对该组命令的使用还需要注意以下方面:● 在命令后输入搜索的模式,再输入要搜索的文件。其中,文件名
列表中也可以使用特殊字符,如“*”等,用来生成文件名列
表。如果想在搜索的模式中包含有空格的字符串,可以用单引号
把要搜索的模式括起来,用来表明搜索的模式是由包含空格的字
符串组成。在下面的例子中,grep命令在文件示例中搜索模式“text file”。$grep ‘text file’● 特殊字符在搜索一组指定的文件时非常有用。例如,如果想搜索
所有的C程序源文件中特定的模式,可以用“*.c”来指定文件名
列表。假设用户的C程序中包含一些不必要的转向语句(goto语
句),想要找到这些语句,可以用如下命令来搜索并显示所有包
含goto语句的代码行:$grep goto *.c
示例:
① 已在Diaz电信注册的不同客户的材料存储在Customers文件中。该文件的示例数据如下:"000001","Angela","Smith","16223 Radiance Court","Kansas City","Kansas""000002","Barbara","Johnson","227 Beach Ave.","Alexandria","Virginia""000003","Betty","Williams","1 Tread Road","Dublin","Georgia"
② 写一个计算住在Kansas州的人的个数的命令:grep-cKansas ③ 写一个命令,显示客户Linda的完整材料及出现该材料的行号:grep-n Linda 功能:tar是一个压缩解压缩工具。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初用来在磁带上创建档案,现在用户可以在任何设备(如软盘)上创建档案。利用tar命令,可以把一大堆文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于在网络上传输是非常有用的。Linux上的tar是GNU版本的。 语法:tar[主选项+辅选项]目标文档 源文件或者目录 在使用该命令时,“主选项”是必须有的,它告诉tar要做什么事情;“辅选项”是辅助使用的,可以选用。 参数: -c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。 -r 把要存档的文件追加到档案文件的未尾。例如,用户已经做好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。 -t 列出档案文件的内容,查看已经备份了哪些文件。 -u 更新文件。也就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。 -x 从档案文件中释放文件。 注意:c、x和t仅能存在其中一个,不可同时存在! 辅助选项: -b 该选项是为磁带机设定的。其后跟一个数字,用来说明区块的大小,系统预设值为20(20×512 bytes)。 -f 使用档案文件或设备,这个选项通常是必选的。请留意,在f之后要立即接档名,不能再加参数。 -k 保存已经存在的文件。例如,我们把某个文件还原,若在还原的过程中遇到相同的文件,则不会进行覆盖。 -m 在还原文件时,把所有文件的修改时间设定为现在。 -M 创建多卷的档案文件,以便在几个磁盘中存放。 -v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。 -w 每一步都要求确认。 -z 用gzip来压缩/解压缩文件,后缀名为“.gz”;加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。 -j 用bzip2来压缩/解压缩文件,后缀名为“.bz2”;加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。 示例: ① 把“/home”目录下包括它的子目录全部做备份文件,备份文件名为“aa.tar”。$tar cvfaa.tar/home ② 把“/home”目录下包括它的子目录全部做备份文件,并进行压缩,备份文件名为“aa.tar.gz”。$tar czvfaa.tar.gz/home //或者tar jcvf aa.tar.bz2/home ③ 把aa.tar.gz这个备份文件还原并解压缩。$tar xzvfaa.tar.gz //或者tar jxvf aa.tar.bz2 ④ 查看aa.tar备份文件的内容,并以分屏方式显示在显示器上。$tar tvfaa.tarmore 要将文件备份到一个特定的设备,只需把设备名作为备份文件名即可。 ⑤ 用户在/dev/fd0设备的光盘中创建一个备份文件,并将“/home”目录中所有文件都复制到备份文件中。$tar cf/dev/fd0/home 要恢复设备磁盘中的文件,可使用xf选项:$tar xf/dev/fd0 如果用户备份的文件大小超过设备可用的存储空间,如光盘,可以创建一个多卷的tar备份文件。M选项指示tar命令提示你使用一个新的存储设备,当使用M选项向一个光驱进行存档时,tar命令在一张光盘已满的时候会提醒你再放入一张新的光盘。这样就可以把tar档案存入几张磁盘中了。$tar cMf/dev/fd0/home 要恢复几张盘中的档案,只要将第一张放入光驱,然后输入有x和M选项的tar命令。在必要时会提醒你放入另一张光盘。$tar xMf/dev/fd0 如果要把压缩文件解压到其他位置,需要用-C指定具体路径,如:$tar xzvfaa.tar.gz-C/home 该命令把aa.tar.gz解压到“/home”目录下。1.3.27 gzip/gunzip和bzip2/bunzip2(文件压缩/解压缩) 功能:减小文件大小有两个明显的好处:一是可以降低存储空间;二是当通过网络传输文件时,可以减少传输时间。gzip/gunzip和bzip2/bunzip2是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。下面以gzip为例介绍这两个命令。 语法:gzip[选项]压缩(解压缩)的文件名 参数: -d 将压缩文件解压。 -l 对每个压缩文件,显示下列字段:压缩文件的大小;未压缩文件的大小;压缩比;未压缩文件的名字。 -r 递归式查找指定目录并压缩其中的所有文件或者解压缩。 -t 测试、检查压缩文件是否完整。 -v 对每一个压缩和解压的文件,显示文件名和压缩比。 -num 用指定的数字num调整压缩的速度,-1或—fast表示最快压缩方法(低压缩比),-9或—best表示最慢压缩方法(高压缩比)。系统默认值为6。 示例: 假设一个目录“/home”下有文件mm.txt、sort.txt、xx.com。 ① 把“/home”目录下的每个文件压缩成.gz文件。$cd/home$gzip*$lsa.txt.gz b.txt.gz c.txt.gz ② 把例①中每个压缩的文件解压,并列出详细的信息。$gzip-dv* //等价于gunzip*a.txt.gz 43.1%----- replaced with a.txtb.txt.gz 43.1%----- replaced with b.txtc.txt.gz 43.1%----- replaced with c.txt$lsa.txt b.txt c.txt ③ 详细显示例①中每个压缩文件的信息,但不解压。$lsa.txt.gz b.txt.gz c.txt.gz$gzip-l*compressed uncompr. ratio uncompressed_name277 445 43.1% a.txt278 445 43.1% b.txt277 445 43.1% c.txt ④ 压缩一个tar备份文件,如aa.tar,此时压缩文件的扩展名为“.tar.gz”。$gzipaa.tar$lsaa.tar.gz 常见的后缀: ① tar后缀 解压:tar xvf FileName.tar 打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩。) ② .gz后缀 解压:gunzip FileName.gz 解压:gzip-d FileName.gz 压缩:gzip FileName ③ .tar.gz和.tgz后缀 解压:tar zxvf FileName.tar.gz 压缩:tar zcvf FileName.tar.gz DirName ④ .bz2后缀 解压:bzip2-d FileName.bz2 解压:bunzip2 FileName.bz2 压缩:bzip2-z FileName //-z可以去掉 ⑤ .tar.bz2后缀 解压:tar jxvf FileName.tar.bz2
试读结束[说明:试读内容隐藏了图片]