序
传智播客和“黑马程序员”
江苏传智播客教育科技股份有限公司(简称“传智播客”)是一家专门致力于培养高素质软件开发人才的科技公司,“黑马程序员”是传智播客旗下的高端IT教育品牌。
“黑马程序员”的学员多为大学毕业后想从事IT行业,但各方面条件还不成熟的年轻人。“黑马程序员”的学员筛选制度非常严格,包括严格的技术测试、自学能力测试以及性格测试、压力测试、品德测试等。百里挑一的残酷筛选制度确保了学员质量,并降低了企业的用人风险。
自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研三个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,有针对性地出版了计算机系列教材五十多种,制作了教学视频数十套,并发表了各类技术文章数百篇。
“黑马程序员”不仅斥资研发IT系列教材,还为高校师生提供以下配套学习资源与服务。
为大学生提供的配套服务:
(1) 专业的辅助学习平台“博学谷”(http://yx.boxuegu.com),有专业老师在线为您答疑解惑。
(2) 针对高校学生在学习过程中存在的压力等问题,我们还面向大学生量身打造了“播妞”。播妞不仅致力推行快乐学习,还会有定期的助学红包雨。有兴趣的同学可添加播妞微信/QQ: 208695827。
(3) 高校学生也可扫描右方二维码,加入播妞粉丝团,获取最新学习资源,与播妞一起快乐学习。
为IT教师提供的配套服务:
针对高校教学,“黑马程序员”为IT系列教材精心设计了“教案+授课资源+考试系统+题库+教学辅助案例”的系列教学资源。高校老师请关注码大牛老师微信/QQ: 2011168841,获取教材配套资源,也可以扫描右方二维码,加入专为IT教师打造的师资服务平台——“教学好助手”,获取“黑马程序员”最新教师教学辅助资源相关动态。
前言
随着互联网的发展,计算机新技术如雨后春笋,层出不穷,这也促使越来越多的学子投入到计算机的学习与研发中;而二十多年来,Linux操作系统已逐渐被越来越多的人接受和认可,并被众多企业广泛应用到服务器以及嵌入式开发等领域。因此,Linux操作系统的使用以及基于Linux的应用开发成为计算机专业学子应掌握的必备技能。
然而,黑马程序员在近些年的观察和研究中发现: 面临就业的高校学子虽已经学习了编程语言与操作系统等的相关课程,但缺乏动手能力,难以将理论联系到实际。这皆因他们所用教材不是体系结构不够系统,就是知识不够全面,再加上讲解的知识较深奥,以至于学子难以掌握切实可用的实质。
针对这种现象,黑马程序员决定推出一本更符合学生实际需求的教材。为保障学生在学习的过程中能学有所得,在学习之后能学以致用,黑马程序员经过大量调研与长期编写,推出了本书,作为Linux课程的初级教材。
为什么要学习本书
Linux操作系统自诞生至今逐步发展并日渐完善,因其开源、安全、稳定等特性,成为众多企业与政府部门搭建服务器的首选平台。此外,Linux在移动应用与嵌入式开发领域也被广泛采用,因此掌握Linux系统的使用与Linux平台下的程序开发方法成为众多计算机从业人员需要掌握的必备技能。
本书在大纲制定上参照了传智播客C/C++学院数年来结合计算机发展趋势及企业需求所研发课程体系中的Linux系统编程部分,涵盖了Linux基本操作、常用工具、系统管理与程序开发等使用Linux系统以及在Linux环境下进行开发所需的必要知识;在内容安排上,由Linux环境搭建入手,逐步讲解了Linux的基本操作、常用工具、系统管理以及程序开发等知识,由浅入深,由易到难,循序渐进;在讲解方式上,将理论与实践相结合,为大多知识点都配备相应案例,保障读者能将理论与实践结合,在掌握理论知识的同时强化动手能力。
如何使用本书
本书以与企业中所用环境(Red Hat Enterprise Linux)较为接近的Linux版本(CentOS 6.8)为开发环境,主要介绍Linux系统的使用与Linux环境下的程序开发。本书中涉及的命令、语法与系统调用都配备了具体的案例,旨在让读者了解Linux平台下的常用服务器前言Linux编程基础模型。
若本书用于课堂教学,建议教师在讲解理论知识后,先引导学生自主动手实现教材中提供的案例,培养学生思考问题、分析问题、解决问题的能力,以期学生可更深刻地理解、掌握相应知识。
若读者为自主学习者,建议您勤思考、勤练习、勤总结,尽量完成并熟练掌握教材中配备的案例,并通过章节配套测试题进行自我检测和查漏补缺。若您在学习的过程中遇到困难或者有疑惑,可向问答精灵咨询。
本教材共分11章,每章的大体内容如下。
第1章首先介绍Linux系统的背景,包括Linux的起源、发展、应用领域、常用版本,以及GNU项目计划和POSIX版本;之后介绍Linux环境搭建过程;最后介绍VMware虚拟网络配置、Linux的远程终端访问和远程文件管理。通过本章的学习,读者可对Linux系统的背景有所了解,并能顺利搭建Linux环境,掌握Linux的远程终端访问方式及远程文件的管理。
第2章讲解Linux系统中的基本命令与开发工具,其中基本命令部分介绍与文件、网络、通信、压缩解压及帮助相关的命令,开发工具部分介绍vi编辑器、GCC编译器与GDB调试工具。掌握本章所讲的知识,可提高Linux系统使用与Linux环境开发的效率。
第3章讲解Linux系统中与用户、用户组管理相关的知识。Linux是一个支持多用户的操作系统,通过本章的学习,读者应能掌握Linux系统中管理用户、用户组的命令,以及用户切换的方法。
第4章讲解Linux的内核——Shell的相关知识、Shell应用技巧以及Shell脚本编程的相关语法。其中Shell编程语法包括Shell变量、条件语句、循环语句、函数,4.6节还给出了Shell脚本的调试方法。
第5章讲解磁盘与目录、Linux文件系统、Linux文件类型与文件操作,其中重点为磁盘的逻辑分区方式、文件系统的结构、文件操作。通过本章的学习,读者应掌握以上重点知识,并熟悉磁盘分区、挂载、卸载的方式与创建文件系统的方法。
第6章讲解Linux进程管理相关的知识,包括进程处理机制、进程属性、进程控制以及进程管理命令。通过本章的学习,读者应熟练掌握进程的处理机制,以及控制进程的方法,包括创建进程、退出进程与进程同步等。
第7章讲解Linux系统中的信号机制,包括信号来源、产生方式、信号阻塞、信号捕获和时序竞态等知识。通过本章的学习,读者应能在终端与程序中使用信号管理和控制进程。
第8章讲解进程间通信的方式,包括管道通信、消息队列通信、信号量通信与共享内存通信。通过本章的学习,读者应熟悉Linux系统中进程通信的这几种机制,并能在程序中使用这些机制实现进程通信。
第9章主要讲解Linux系统中的线程,包括线程的定义、线程相关操作、线程的属性,以及实现线程同步的机制。线程操作包括创建线程、退出线程、终止线程、挂起线程和线程分离,通过设置线程的属性亦可实现其中的部分操作。线程同步可通过互斥锁、条件变量、信号量实现。学习本章之后,读者应能在Linux环境开发中熟练操作线程、掌握线程同步机制,并熟悉线程的属性、可通过线程属性设置线程的状态。
第10章主要讲解socket编程,即Linux系统中的网络编程。其中首先简述计算机网络的协议与体系结构,之后讲解了socket编程中用到的系统调用、基于TCP和UDP两种协议的通信流程并补充网络编程中所需的知识,通过实际案例展示了不同协议下基于C/S模型的通信方式,最后对socket本地通信作了简单介绍。
第11章对Linux系统中涉及的几种并发服务器模型作了讲解,包括多进程并发服务器、多线程并发服务器、I/O多路转接服务器、线程池,最后对epoll的工作模式进行了补充。通过本章的学习,读者应对Linux系统中的服务器有所了解。
读者若不能完全理解教材中所讲知识,可登录博学谷平台,配合平台中的教学视频进行学习。此外读者在学习的过程中,务必要勤于练习,确保真正掌握所学知识。若在学习的过程中遇到无法解决的困难,建议读者莫要纠结于此,继续往后学习,或可豁然开朗。
致谢
本教材的编写和整理工作由传智播客教育科技股份有限公司完成,主要参与人员有吕春林、高美云、薛蒙蒙、郑瑶瑶、韩冬、王晓娟、刘传梅、朱景尧、王保明、刘宗伟等。全体人员在这近一年的编写过程中付出了很多辛勤的汗水。
意见反馈
尽管我们尽了最大的努力,但教材中难免会有不妥之处,欢迎各界专家和读者朋友们来信来函给予宝贵意见,我们将不胜感激。您在阅读本书时,如发现任何问题或有不认同之处,可以通过电子邮件与我们取得联系。
黑马程序员
2017年6月于北京
第5章Linux文件系统与操作学习目标
了解磁盘分区与目录结构
掌握ext2文件系统布局
掌握数据块寻址方式
熟悉Linux系统中的文件类型
掌握Linux系统中实现I/O操作的方法计算机之所以能运行,是因为在机器硬件上配备了完整的操作系统。操作系统规定了计算机的运行方式和处理请求的方式,是计算机不可分割的一部分。在操作系统安装时,安装程序会为计算机安装一个文件系统。文件系统与操作系统类似,都相当于一个程序,存在于存储设备上,但文件系统用于规定文件的存取和操作方式。存储设备的正常使用离不开文件系统,本章将会结合磁盘结构对文件系统和Linux系统中的文件进行讲解。
5.1磁盘与目录
磁盘是文件系统的底层支持,目录是文件系统的具体表现,磁盘与目录都和文件系统密不可分。本节先对磁盘的结构进行讲解,再讲解目录结构(即文件的组织方式),以及存取文件时涉及的关键结构——inode和dentry。
5.1.1磁盘与磁盘分区
磁盘是计算机中的主要存储设备,一般由主轴、盘片和读写磁头组成,如图51所示。磁盘中包含多张盘片,每张盘片包含上下两个盘面,盘片固定在磁盘的主轴上,盘片的每个盘面都有一个固定在动臂上的读写磁头;计算机中的数据存储在磁盘的盘面上,盘片随主轴的旋转而转动,固定在动臂上的读写磁头在盘片转动的同时读取盘面上存储的信息。
图51磁盘结构示意图
磁盘的盘片又可细分: 图51中盘片上的圆环称为磁道,每张盘片上有许多磁道。多张盘片上半径相同的磁道组成的圆柱面称为柱面,一张盘片有多少磁道,磁盘就有多少柱面。磁道是读写磁头读写的轨迹,读写磁头可以在动臂的带动下切换访问的柱面。由内及外,扇区中的磁道逐渐增大。较大的磁道能够存储更多的数据,但因为磁道中能存储的数据量不同,所以以磁道作为存储单位显然会为数据存储带来麻烦。
磁盘上的盘片被细分为多个大小相同的扇区,扇区是磁盘空间的基本单位。一般来说,一个扇区的大小为512字节。磁盘中第一个扇区非常重要,其中存储了与磁盘正常使用相关的重要信息,分别为: 主引导记录、磁盘分区表和魔数。第5章Linux文件系统与操作Linux编程基础 主引导记录(MBR,Master Boot Record)占用446个字节,其中包含一段被称为引导加载流程(Boot Loader)的程序。计算机启动后,会到磁盘0扇面的0扇区去读取MBR中的内容,只有MBR中的程序正确无误,计算机才能正常开机。
磁盘分区表(partition table)占用64个字节,其中记录整块磁盘的分区状态。每个分区的信息需要16个字节,因此磁盘分区表若只记录分区信息,便最多只能存储4个分区的分区信息。
魔数(magic number)占用两个字节,用来标识MBR是否有效。
在计算机诞生伊始,其存储空间是极其有限的,但随着计算机硬件与软件的发展,普通计算机中配备磁盘的存储空间已能用T来计算,这表示磁盘中能够存储的数据也有了极大的提升。为了更好地组织文件,并提高磁盘的读写效率,为磁盘分区是一个明智的选择。
若要为现实中的空间分区,如为一间房间分区,可以通过在房间中添加格档来实现,但对于磁盘来说,这种方法显然行不通。在对磁盘结构分区时,我们提到,磁盘的第一个扇区中存储着一张“磁盘分区表”,其实利用这张表便能为磁盘分区。
磁盘由若干个柱面组成,假设一个磁盘有500个柱面,将磁盘分为4个扇区,那么只需要将磁盘的分区信息记录在磁盘分区表中即可。按上述方式,磁盘分区与分区表的关系应如图52所示(每个分区的柱面数可不相同)。
图52分区表与磁盘分区
Linux系统中遵循“一切皆文件”的思想,Linux下的设备也会被视为文件。硬盘作为设备的一种,其对应的文件被存储于系统的/dev目录下。若磁盘为SATA类型,则磁盘路径名为/dev/sda,图52所示的四个分区在/dev目录下对应的文件名如下所示:
P1: /dev/sda1
P2: /dev/sda2
P3: /dev/sda3
P4: /dev/sda4
设备的文件名由路径、设备名与分区编号构成,若要在P2分区中存储数据,则相应的数据会被写到磁盘中编号为101~200的磁道上。
Linux和Windows系统中磁盘分区的方式是相同的,也就是说Windows系统中也有一个64字节的分区表。前文讲到,分区表中最多只能记录4个分区的属性信息,但是熟悉Windows系统的用户应该知道,Windows系统中可以有不止4个分区,这是为什么呢?
原来磁盘除可以划分出主分区外,还可以划分出一个扩展分区,而扩展分区可以再次划分,由扩展分区划分出的分区被称为逻辑分区。逻辑分区中的信息同样需要存储,通常这些信息会被存储在由扩展分区划分出的第一个逻辑分区的第一个扇区中。
若磁盘中包含500个磁道,磁盘被分为一个主分区和一个扩展分区,且扩展分区又被划分为4个逻辑分区,那么主分区表和逻辑分区表中的分区与磁盘的对应关系如图53所示。
图53主分区与逻辑分区
图53的磁盘中有两个分区表(分别用黑色扇形和方块表示)。存在于分区P1中的分区表为主分区表,共占64字节,其中只记录了两个分区: P1和P2。分区P1为主分区,分区P2为扩展分区,分区P2又被划分为4个逻辑分区L1~L4,其分区信息存储于第101个柱面的扇区中。若Linux系统按图53所示的方式分区,/dev目录下将会有6个设备文件,文件的路径名分别如下:
P1: /dev/sda1
P2: /dev/sda2
L1: /dev/sda5
L2: /dev/sda6
L3: /dev/sda7
L4: /dev/sda8
……