《互联网Linux程序设计技术技巧与项目实践第10章》由会员分享,可在线阅读,更多相关《互联网Linux程序设计技术技巧与项目实践第10章(94页珍藏版)》请在金锄头文库上搜索。
1、第十章 Linux程序设计实践项目实践项目一实践项目一 虚拟机环境下的虚拟机环境下的LINUX安装安装实践项目二实践项目二 LINUX的系统管理与基本命的系统管理与基本命实践项目三实践项目三 VI编辑器练习编辑器练习实践项目四实践项目四 SHELL程序设计程序设计实践项目五实践项目五 C程序设计与多文件编译程序设计与多文件编译实践项目六实践项目六 内存动态分区管理内存动态分区管理实践项目七实践项目七 LINUX文件操作编程文件操作编程实践项目八实践项目八 系统调用与设备管理系统调用与设备管理 9/11/2024110.1 实践项目一 虚拟机环境下的Linux安装10.1.1 实践目的实践目的1
2、. 掌握掌握linux系列操作系统的安装过程。系列操作系统的安装过程。2. 掌握启动、关闭和管理操作系统的基本方法。掌握启动、关闭和管理操作系统的基本方法。3. 学会安装其他软件的方法。学会安装其他软件的方法。10.1.2 实践准备实践准备Red Hat Linux操作系统既可以单独安装在一个计算机系统中,也可以操作系统既可以单独安装在一个计算机系统中,也可以与与Windows等操作系统共同安装在一个计算机硬件系统中,但注意安等操作系统共同安装在一个计算机硬件系统中,但注意安装顺序,要求最后安装装顺序,要求最后安装linux系统。系统。关于操作系统的安装要了解一些基本知识,概括起来就是如下的内
3、容:关于操作系统的安装要了解一些基本知识,概括起来就是如下的内容:1.硬盘分区。一个硬盘可以分割成不同的分区,每个分区作为一个逻硬盘分区。一个硬盘可以分割成不同的分区,每个分区作为一个逻辑硬盘使用。每个分区都有一个类型,表示这个分区中的信息是如何辑硬盘使用。每个分区都有一个类型,表示这个分区中的信息是如何存储的。为安装存储的。为安装Red Hat Linux,常推荐的分区配置:根分区、交换分,常推荐的分区配置:根分区、交换分区、区、/usr分区、分区、/home分区。还可以根据不同使用环境创建分区。还可以根据不同使用环境创建/usr/local分区、分区、/usr/src分区、分区、/var分
4、区和分区和/boot分区等。分区等。 2.安装类型。安装类型。Red Hat Linux提供了提供了3种类型的安装:客户机类型种类型的安装:客户机类型(Workstation)、服务器类型安装(、服务器类型安装(Server System)和自定义类型的)和自定义类型的安装安装(Custom System)。9/11/2024210.1.3 实践内容实践内容首先熟悉从光盘安装首先熟悉从光盘安装Red Hat Linux的基本过程。这个过程包括一下的基本过程。这个过程包括一下的步骤:的步骤:从光盘或文件启动安装程序、是否检测从光盘或文件启动安装程序、是否检测CD介质、语言选择、键盘配介质、语言选
5、择、键盘配置、安装方式选择、鼠标配置、升级还是安装、为置、安装方式选择、鼠标配置、升级还是安装、为Red Hat Linux创创建分区(通常选默认分区)、制作启动软盘、时区选择、建分区(通常选默认分区)、制作启动软盘、时区选择、root账户配账户配置、选择安装包、结束安装。置、选择安装包、结束安装。关于安装关于安装linux或或iso文件安装的具体过程和细节请参考本书第二章的相文件安装的具体过程和细节请参考本书第二章的相关内容或网络与其它教材中的相关内容。关内容或网络与其它教材中的相关内容。这里安装的环境软件是这里安装的环境软件是Windows XP+VMware6.0+RHELinux AS
6、 4。先准备好这些软件,可以通过网络、学校或单位的先准备好这些软件,可以通过网络、学校或单位的ftp站点去下载,也站点去下载,也可以通过其它途径获得。这些软件目前已有最新的版本或可以通过其它途径获得。这些软件目前已有最新的版本或linux的其它的其它版本,读者可以自行试用,安装过程大同小异。如果出现了一些情况版本,读者可以自行试用,安装过程大同小异。如果出现了一些情况而无法继续安装,请利用关键词或短句通过网络或其它手段不断交流而无法继续安装,请利用关键词或短句通过网络或其它手段不断交流来解决问题。来解决问题。9/11/20243下面在下面在VMware6.0上安装上安装Red Hat Ente
7、rprise Linux AS 4解析安装过程。解析安装过程。1安装安装VMware6.0,根据提示进行安装和注册。,根据提示进行安装和注册。2运行运行VMware6.0,呈现如图,呈现如图10.1的界面。的界面。9/11/202443点击点击“新建虚拟机新建虚拟机”创建一个新的虚拟机,出创建一个新的虚拟机,出现如图现如图10.2的向导。的向导。4点击点击“下一步下一步”,进入图,进入图10.3,选择,选择“典型典型”。如果选择如果选择“自定义自定义”,可以有更多的选择,但比,可以有更多的选择,但比较复杂,建议熟练后再选择较复杂,建议熟练后再选择“自定义自定义”安装项。安装项。这里建议第一次安
8、装时选择这里建议第一次安装时选择“典型典型”选项。选项。9/11/202455. 选择选择linux客户机系统如图客户机系统如图10.4,版本为,版本为Red Hat Enterprise Linux 4。9/11/202466填写虚拟机名称,并且选择文件保存目录,如图填写虚拟机名称,并且选择文件保存目录,如图10.5。9/11/202477选择虚拟机使用的网络类型选择虚拟机使用的网络类型“使用桥接网络使用桥接网络”,如图,如图10.6。9/11/202488制定磁盘容量,如图制定磁盘容量,如图10.7。一般而言,默认的是。一般而言,默认的是8个个G的空间安装的空间安装linux,简化安装只需
9、要,简化安装只需要3G的空的空间。点间。点“完成完成”则会出现虚拟机创建成功的温馨则会出现虚拟机创建成功的温馨提示。至此,就完成了虚拟机的创建过程。这里提示。至此,就完成了虚拟机的创建过程。这里是中英文混合界面,实际上,也就几个单词而已,是中英文混合界面,实际上,也就几个单词而已,其它软件也一样,大不了翻翻词典就能完全明白,其它软件也一样,大不了翻翻词典就能完全明白,不翻词典也能猜出来。不翻词典也能猜出来。9/11/202499按按Ctrl+D进行虚拟机设置,如图进行虚拟机设置,如图10.8,设置内存,设置内存为为1G,虚拟处理器根据实际情况可设置为,虚拟处理器根据实际情况可设置为1个或个或2
10、个,以太网选择桥接方式,其他默认。个,以太网选择桥接方式,其他默认。9/11/20241010为了避免在安装过程中要求换安装盘,在这为了避免在安装过程中要求换安装盘,在这里添加三个光驱硬件,分别对应需使用的各个里添加三个光驱硬件,分别对应需使用的各个ISO镜像文件,如图镜像文件,如图10.9所示。当然,只设一个安所示。当然,只设一个安装盘也可以,在提示换盘时重新选择下一张盘的装盘也可以,在提示换盘时重新选择下一张盘的iso文件就可以了。点文件就可以了。点OK回到回到Vmware的软件界面。的软件界面。9/11/20241111按按Ctrl+B或点工具栏上的绿三角图标,默认设或点工具栏上的绿三角
11、图标,默认设置是光驱启动虚拟机,则进入到如图置是光驱启动虚拟机,则进入到如图10.10的界面,的界面,直接按回车开始安装。如果按回车没有反应,请直接按回车开始安装。如果按回车没有反应,请把鼠标在虚拟机的界面上点一下,再按回车就能把鼠标在虚拟机的界面上点一下,再按回车就能够继续。够继续。9/11/20241212选择是否探测你的光盘正确性,这里因为采用选择是否探测你的光盘正确性,这里因为采用iso文件安装,所以选择文件安装,所以选择“Skip”。因为此时的鼠。因为此时的鼠标不可见,只能用标不可见,只能用“”键来选择,然后回车。键来选择,然后回车。此时鼠标在虚拟机里,在此时鼠标在虚拟机里,在win
12、dows里是无法使用里是无法使用的,怎么办呢?同时按下的,怎么办呢?同时按下Ctrl和和Alt键,就可以把键,就可以把鼠标从虚拟机里调出来使用。以后可以在菜单里鼠标从虚拟机里调出来使用。以后可以在菜单里点点“安装虚拟机工具安装虚拟机工具”或或“Install VMware Tools”来激活鼠标,就无需在按组合键了。来激活鼠标,就无需在按组合键了。9/11/20241313系统进入图形安装界面,点系统进入图形安装界面,点“Next”。如果没。如果没有出现图有出现图10.11的欢迎界面,或者在字符界面的最的欢迎界面,或者在字符界面的最后一行出现后一行出现“you may safely reboo
13、t your system”的友好提示,可以从头再来,选择的友好提示,可以从头再来,选择“自定义自定义”并并适当配置其中的选项,直到出现本届面为止才能适当配置其中的选项,直到出现本届面为止才能正确安装。最好是重新下载第一张盘的正确安装。最好是重新下载第一张盘的iso文件或文件或把该文件位置放在第一个磁盘。把该文件位置放在第一个磁盘。9/11/20241414点点“Next”进入安装向导进入安装向导“语言选择语言选择”界面,界面,选择选择“Chinese”,则向导就变为中文提示。,则向导就变为中文提示。15点点“Next” 进入进入“键盘配置键盘配置”,默认选择就,默认选择就可以,点可以,点“下
14、一步下一步”。16进入进入“磁盘分区设置磁盘分区设置”页,选择页,选择“用用Disk Druid手工分区手工分区(D)”,并在弹出警告中选择,并在弹出警告中选择“是是”17进入磁盘分区如图进入磁盘分区如图10.12所示。所示。9/11/20241518进行简单分区,分别创建一个交换分区(内存进行简单分区,分别创建一个交换分区(内存大小的大小的2倍)和根分区(剩余空间),如图倍)和根分区(剩余空间),如图10.13。9/11/20241619根据提示完成其它选项的设置,如图根据提示完成其它选项的设置,如图10.14所示。所示。9/11/20241720在在VMware Workstation中点
15、链接中点链接“Start this virtual machine”就可以启动该就可以启动该linux系统,在其中系统,在其中进行进行linux的所有练习和在的所有练习和在pc上直接安装上直接安装linux的环的环境下相同,不同的地方就是网络设置有些区别。境下相同,不同的地方就是网络设置有些区别。下面图下面图10.15就是安装好的就是安装好的RHEL AS4启动后的登启动后的登录界面。录界面。9/11/20241821下面图下面图10.16是是RHEL AS4登录成功后的主窗口,登录成功后的主窗口,即桌面情况。即桌面情况。9/11/20241922至此,安装过程就结束了。针对不同的至此,安装过
16、程就结束了。针对不同的linux版本,安版本,安装过程大同小异。多多练习,就会熟能生巧的。装过程大同小异。多多练习,就会熟能生巧的。实际上,不仅可以在实际上,不仅可以在VMware下安装下安装linux,还可以安装几,还可以安装几乎所有的操作系统,生成虚拟机。在虚拟机里,可以海阔乎所有的操作系统,生成虚拟机。在虚拟机里,可以海阔凭鱼跃,天高任鸟飞。即使系统崩溃了,也不过使昙花一凭鱼跃,天高任鸟飞。即使系统崩溃了,也不过使昙花一现而已,再装一次就可以从头再来。对宿主系统丝毫没有现而已,再装一次就可以从头再来。对宿主系统丝毫没有影响,唯一的影响就是在虚拟机运行时会占用宿主机的资影响,唯一的影响就是
17、在虚拟机运行时会占用宿主机的资源,导致一些程序运行速度减缓而已。源,导致一些程序运行速度减缓而已。VMware为用户熟练掌握操作系统提供了广阔的空间,可为用户熟练掌握操作系统提供了广阔的空间,可以在其间多多练习,成为系统管理的行家里手,将来在学以在其间多多练习,成为系统管理的行家里手,将来在学习与工作中可以一帆风顺,步步高升。宿主机的系统也可习与工作中可以一帆风顺,步步高升。宿主机的系统也可以多种多样,除了以多种多样,除了windows XP外,也可以是各种外,也可以是各种linux系系统。统。9/11/20242010.2 实践项目二 Linux的系统管理与基本命令10.2.1 实践目的实践
18、目的1.掌握掌握linux系统的进入和退出。系统的进入和退出。2.掌握掌握linux系统用户管理和文件管理。系统用户管理和文件管理。4.掌握基本的掌握基本的linux命令,加深对文件、目录、文件系统等命令,加深对文件、目录、文件系统等概念的理解。概念的理解。5.掌握掌握linux文件系统的目录结构。文件系统的目录结构。 6.掌握有关掌握有关linux文件系统的常用命令。文件系统的常用命令。10.2.2 实践内容实践内容1.Linux的进入和退出的进入和退出2.用户和用户组管理用户和用户组管理3.文件系统管理文件系统管理4.学习常用的学习常用的linux命令功能及格式。命令功能及格式。2练习使用
19、这些命令及各命令参数。练习使用这些命令及各命令参数。9/11/20242110.2.3 实践步骤实践步骤1. Linux的进入和退出的进入和退出(1)启动启动Red Hat Linux系统。系统。通过通过LILO启动启动Red Hat Linux。在。在LILO提示符提示符boot:下输下输入想启动的操作系统的名称,或者在入想启动的操作系统的名称,或者在LILO提示符下按提示符下按Tab键,则会看到键,则会看到LILO可以启动的操作系统清单,选择可以启动的操作系统清单,选择Red Hat Linux就可以启动就可以启动Red Hat Linux。从软盘启动从软盘启动Red Hat Linux。
20、将启动软盘插入第一个软盘。将启动软盘插入第一个软盘驱动器,然后接通电源,就可以启动驱动器,然后接通电源,就可以启动Red Hat Linux。(2)登录)登录Red Hat Linux。Red Hat Linux启动成功后,在屏幕上会出现如下的提示启动成功后,在屏幕上会出现如下的提示信息并且最后的光标闪烁。信息并且最后的光标闪烁。Localhost login: _9/11/202422此时可以登录此时可以登录Red Hat Linux。第一次登录。第一次登录Red Hat Linux须用须用root账号。这个账号对系统的一切都具有完全的访问账号。这个账号对系统的一切都具有完全的访问权限,用来
21、执行系统管理任务,如创建新的用户账号。在权限,用来执行系统管理任务,如创建新的用户账号。在login:提示符后输入提示符后输入root,按,按Enter键,会出现键,会出现Password:,要求输入要求输入root账号口令,若口令正确,则会出现下面的命账号口令,若口令正确,则会出现下面的命令行表示登录成功。令行表示登录成功。rootlocalhost/root# (3)退出退出Red Hat Linux。在用完在用完Red Hat Linux后,必须退出。可以直接输入后,必须退出。可以直接输入logout命令,或输入命令,或输入Ctrl + D 组合键,系统将返回到登录状态。组合键,系统将返
22、回到登录状态。(4)关闭关闭Red Hat Linux.正常关闭需要输入正常关闭需要输入shutdown命令,此命令只能由命令,此命令只能由root账号账号执行。执行。9/11/2024232.用户和用户组管理用户和用户组管理Linux为多用户操作系统,多个用户可以通过自己的终端为多用户操作系统,多个用户可以通过自己的终端同时联机使用同一台主机。系统的每一个合法用户都有一同时联机使用同一台主机。系统的每一个合法用户都有一个惟一的用户名(账号),用户要使用个惟一的用户名(账号),用户要使用linux系统,必须用系统,必须用linux预先设置的用户名(账号)登录,而不能随意用一个预先设置的用户名(
23、账号)登录,而不能随意用一个未在系统中注册的用户名登录。每个用户还需要一个口令。未在系统中注册的用户名登录。每个用户还需要一个口令。除了登录用户名和口令外,每个用户还有其他一些属性,除了登录用户名和口令外,每个用户还有其他一些属性,如:用户如:用户ID、用户组、用户组ID、主目录、登录、主目录、登录shell等。所有用户等。所有用户信息都存放在系统文件信息都存放在系统文件/etc/passwd和和/etc/group中。中。只有只有root账户才有权进行用户管理。账户才有权进行用户管理。(1)用户管理。用户管理包括增加、修改和删除用户账号。用户管理。用户管理包括增加、修改和删除用户账号。这些工
24、作可以通过手工编辑有关文件完成,但是最好使用这些工作可以通过手工编辑有关文件完成,但是最好使用用户管理工具。这里介绍一组简单的基于命令的用户管理用户管理工具。这里介绍一组简单的基于命令的用户管理工具:工具:useradd、usermod、userdel和基于图形界面的用户和基于图形界面的用户管理工具管理工具control-panel。9/11/202424增加一个用户。可以使用增加一个用户。可以使用useradd命令,用法如下:命令,用法如下:例如可用命令例如可用命令#useradd john增加名为增加名为john的用户,除了用户名外,其的用户,除了用户名外,其他参数均为默认值。他参数均为默
25、认值。为了让新用户登录,还要设置登录口令,使用为了让新用户登录,还要设置登录口令,使用passwd完成。如:完成。如:rootlocalhost root#passwd john就会出现就会出现“New password:”的提示,输入口令后回车,又会出的提示,输入口令后回车,又会出现现“Retype new password:”的提示,让重新输入一次口令,如果两的提示,让重新输入一次口令,如果两次口令相同,就会提示口令更新成功,并在下一行出现命令行提示符次口令相同,就会提示口令更新成功,并在下一行出现命令行提示符“#”。修改用户信息。可以使用修改用户信息。可以使用usermod命令,具体用法
26、请参考手册。命令,具体用法请参考手册。例如,以下命令设置了用户例如,以下命令设置了用户john的账号在的账号在2009年年7月月10日之后无效。日之后无效。rootlocalhost root#usermod -e 7/10/09 john 删除用户。可以用删除用户。可以用userdel命令,例如,删除用户命令,例如,删除用户john,可以使用以下可以使用以下命令:命令:rootlocalhost root#userdel john 以上以上userdel的用法只删除用户账号,并不删除其主目录。如果在删除的用法只删除用户账号,并不删除其主目录。如果在删除用户时还要删除其主目录,则可以加上选项用
27、户时还要删除其主目录,则可以加上选项“-r”。9/11/202425(2)用户组管理。在用户组管理。在linux系统中,每个用户都属于一个或多个用户组。系统中,每个用户都属于一个或多个用户组。如果一个用户属于一个用户组,则享有该用户组的权限。这样,只需如果一个用户属于一个用户组,则享有该用户组的权限。这样,只需设置用户组的权限,就可以设置一组用户的权限。设置用户组的权限,就可以设置一组用户的权限。增加一个用户组。可以使用增加一个用户组。可以使用groupadd命令。基本用法:命令。基本用法:groupadd-g gid -o -r -f group 例如,可以用以下命令增加一个名为例如,可以用
28、以下命令增加一个名为teachers的用户组:的用户组:rootlocalhost root#groupadd teachers 结果是在用户组文件结果是在用户组文件/etc/group中增加了一行:中增加了一行:teachers:x:507:修改一个用户组。可以使用修改一个用户组。可以使用groupmod命令,用法如下:命令,用法如下:groupmod-g gid -o -n name group 例如,可以用以下命令将用户组例如,可以用以下命令将用户组teachers改名为改名为staff:rootlocalhost root#groupmod -n staff teachers 删除用户
29、组。可以用删除用户组。可以用groupdel命令。该命令的用法很简单,只要在命令。该命令的用法很简单,只要在命令后加上要删除的用户组名即可。例如,下面的命令可删除名为命令后加上要删除的用户组名即可。例如,下面的命令可删除名为staff的用户组:的用户组:rootlocalhost root#groupdel staff 9/11/2024263文件系统管理文件系统管理数据和程序文件都存储在块设备上,如硬盘、光数据和程序文件都存储在块设备上,如硬盘、光盘等,其中的文件是按不同组织方法组织的,形盘等,其中的文件是按不同组织方法组织的,形成了不同的文件系统,例如成了不同的文件系统,例如ext2,FA
30、T32、FAT16等。等。要想知道要想知道linux支持的文件系统,可以显示一下支持的文件系统,可以显示一下/proc/filesystems 。如果要增加或删除对某个。如果要增加或删除对某个文件系统的支持,可以重新编译内核。文件系统的支持,可以重新编译内核。Linux的所有设备(如硬盘、软盘、光盘等)的文的所有设备(如硬盘、软盘、光盘等)的文件系统都有机地无缝地组成了一个树状文件系统。件系统都有机地无缝地组成了一个树状文件系统。这与这与MS DOS/Windows 9x/Windows NT不一样,不一样,不是每个分区都有独立的驱动盘符。不是每个分区都有独立的驱动盘符。9/11/202427
31、(1)安装和卸载文件系统。在访问一个文件系统前,先将安装和卸载文件系统。在访问一个文件系统前,先将文件系统安装到一个安装目录上,根文件系统除外,它在文件系统安装到一个安装目录上,根文件系统除外,它在启动时自动安装到根目录上。安装方法有二:一是启动时启动时自动安装到根目录上。安装方法有二:一是启动时自动根据文件自动根据文件/etc/fstab安装,二是用安装,二是用mount命令或相关命令或相关工具手工安装。工具手工安装。手工安装。使用手工安装。使用mount命令,用法如下:命令,用法如下: mount -t type device dir 其中,其中,device为待安装文件系统的块设备名;为
32、待安装文件系统的块设备名;type为文件为文件系统类型;系统类型;dir为安装点。例如,将硬盘第一分区上的为安装点。例如,将硬盘第一分区上的FAT32文件系统安装到文件系统安装到/dosc上以便于访问,则命令行是:上以便于访问,则命令行是:rootelocalhost/root#mount -t FAT32/dev/hda1 /dosc还可以用还可以用mount命令来列出系统安装的所有文件系统。命令来列出系统安装的所有文件系统。rootlocalhost/root#mount/dev/hda2 on /boot type ext2(rw)/dev/hda7 on /home type ext2
33、(rw)9/11/202428 手工卸载。使用手工卸载。使用umount命令:命令:umount -nrv device | dir例如,要卸载以上刚安装的文件系统,可以使用例如,要卸载以上刚安装的文件系统,可以使用以下命令:以下命令:rootlocalhost/root#umount /dosc也可以使用以下命令:也可以使用以下命令:rootlocalhost/root#umount /dev/hda1自动安装与卸载。通过文件自动安装与卸载。通过文件/etc/fstab可自动可自动安装及卸载文件系统。文件安装及卸载文件系统。文件/etc/fstab列出了要列出了要安装的文件系统。除注释行的每
34、行描述了一个文安装的文件系统。除注释行的每行描述了一个文件系统,包括设备名、安装点、文件类型、安装件系统,包括设备名、安装点、文件类型、安装选项、备份选项、检查选项,如图选项、备份选项、检查选项,如图10.17。9/11/2024299/11/202430在大多数情况下,在大多数情况下,linux系统所使用的文件系统并不经常发生变化,因系统所使用的文件系统并不经常发生变化,因此,如果将这些经常使用的文件系统存放在文件此,如果将这些经常使用的文件系统存放在文件/etc/fstab之中,则之中,则系统在启动时会自动安装这些文件系统,而在系统关闭时能自动卸载系统在启动时会自动安装这些文件系统,而在系
35、统关闭时能自动卸载它们。它们。(2)监视文件系统状态。当要显示文件系统的使用情况时,使用命令监视文件系统状态。当要显示文件系统的使用情况时,使用命令df。(3)维护文件系统。对文件系统要定期检查和修补。)维护文件系统。对文件系统要定期检查和修补。最常用的方法是在文件最常用的方法是在文件/etc/fstab中将检查选项数值中将检查选项数值(pass number)设置为大于设置为大于0的正整数,如的正整数,如1或或2,这样系统在启动时会自动检查文件,这样系统在启动时会自动检查文件系统的完整性。系统的完整性。另一种方法是直接使用另一种方法是直接使用fsck命令来检查文件系统。这是一个前端命令,命令
36、来检查文件系统。这是一个前端命令,根据不同的文件系统类型,根据不同的文件系统类型,fsck将调用不同的检查程序,如将调用不同的检查程序,如fsck、 ext2等。等。在用在用fsck检查某一文件系统时,最好先卸载这个文件系统。这保证了检查某一文件系统时,最好先卸载这个文件系统。这保证了在检查该文件系统时,没有其他程序同时也在对它进行操作。在检查该文件系统时,没有其他程序同时也在对它进行操作。(4)建立文件系统。当增加一个新硬盘或需要改变硬盘上原来分区时,建立文件系统。当增加一个新硬盘或需要改变硬盘上原来分区时,在在linux能使用之前,需要对磁盘进行分区和创建文件系统。能使用之前,需要对磁盘进
37、行分区和创建文件系统。创建磁盘分区可以用创建磁盘分区可以用fdisk命令,创建文件系统可以用命令,创建文件系统可以用mkfs来完成。来完成。9/11/2024314基本命令实践基本命令实践(1)man命令:显示具有一定格式的在线命令帮助手册,也命令:显示具有一定格式的在线命令帮助手册,也可以显示某个命令的格式。例如:查命令可以显示某个命令的格式。例如:查命令ls的用法,则命的用法,则命令为:令为:$man ls(2)more命令:在终端上按页显示。例如输入命令命令:在终端上按页显示。例如输入命令man ls 后,屏幕上会滚动,这时可以做如下处理:后,屏幕上会滚动,这时可以做如下处理:$man
38、ls|more(3)date命令:显示及修改日期和时间。例如要查看当前命令:显示及修改日期和时间。例如要查看当前的日期和时间,可以如下输入:的日期和时间,可以如下输入:$date若想将当前的日期和时间改为若想将当前的日期和时间改为12月月11日早上日早上9点点30分,可分,可以如下输入以如下输入:$date 121109309/11/202432(4)&后台命令符后台命令符在提示符后输入命令,系统为该命令创建一个进程,这种命令为前台命令。在提示符后输入命令,系统为该命令创建一个进程,这种命令为前台命令。如果在命令行末尾加上如果在命令行末尾加上“&”符,如:符,如:gcc f1.c &,则系统也
39、为这条命令创建一则系统也为这条命令创建一个进程,但它在后台执行,即当没有前台进程执行时它才得以在前台执行,个进程,但它在后台执行,即当没有前台进程执行时它才得以在前台执行,否则只能在后台执行。这种进程称为后台进程。否则只能在后台执行。这种进程称为后台进程。后台命令也可以与其他命令在一行,如:后台命令也可以与其他命令在一行,如:$gcc f1.c & cat f2.c该命令的功能是在后台执行编译文件该命令的功能是在后台执行编译文件f1.c,而在前台显示文件而在前台显示文件f2.c的内容。的内容。(5) wc命令命令功能:统计一个文件中的字节数功能:统计一个文件中的字节数,单词数,行数。例如:单词
40、数,行数。例如:$wc /home/user/f1.c(6) mail命令命令用户间的通信命令。当前用户要给用户用户间的通信命令。当前用户要给用户user10发一条信息,需要的操作是:发一条信息,需要的操作是:$mail user10这时屏幕出现:这时屏幕出现:subject:输入要发送的标题,回车,再输入正文,完成退出时按输入要发送的标题,回车,再输入正文,完成退出时按Ctrl+D组合键。组合键。用户用户user10在读这条消息时,只需输入:在读这条消息时,只需输入:mail屏幕就可以显示发给该用户的消息。屏幕就可以显示发给该用户的消息。9/11/202433(7) who查看系统中其他登录
41、的用户。例如:查看系统中其他登录的用户。例如:$who (8) +z命令命令终止当前进程的执行。如在输入终止当前进程的执行。如在输入$sleep 60命令后,屏幕处于静止状态,这时命令后,屏幕处于静止状态,这时按按+z命令,屏幕出现:命令,屏幕出现:1stopped sleep 60,表明,表明sleep进程终止。进程终止。(9) jobs命令命令查看当前系统中各作业的状态。查看当前系统中各作业的状态。(10) ps命令命令查询正在执行的进程。查询正在执行的进程。ps命令提供命令提供linux系统中正在发生的进程的一个快照,系统中正在发生的进程的一个快照,它能显示正在执行进程的进程标识号,发出
42、该命令的终端,所使用的它能显示正在执行进程的进程标识号,发出该命令的终端,所使用的CPU时时间以及正在执行的命令。间以及正在执行的命令。在执行在执行ps命令的结果中:命令的结果中:PID是指进程的标识号是指进程的标识号ID,TTY是指该进程所在的是指该进程所在的控制终端,控制终端,TIME是该进程累计执行时间,是该进程累计执行时间,CMD是该进程所对应的命令。是该进程所对应的命令。不同进程的不同进程的TTY标识符可以相同,表明这些进程都是在同一终端上建立的。标识符可以相同,表明这些进程都是在同一终端上建立的。用户输入的命令名就是相应的进程名,即命令执行时建立并运行的进程。用户输入的命令名就是相
43、应的进程名,即命令执行时建立并运行的进程。9/11/202434$ps -e可以显示系统中运行的所有进程,包括系统进程和用户进程。可以显示系统中运行的所有进程,包括系统进程和用户进程。系统进程也称作守护进程(系统进程也称作守护进程(daemon),它们不与某台终端或某个用户它们不与某台终端或某个用户相关联,它们不是由用户命令建立的进程,而是由系统创建的进程,相关联,它们不是由用户命令建立的进程,而是由系统创建的进程,专门用于执行系统管理和各种服务等功能,如进程的对换,终端的初专门用于执行系统管理和各种服务等功能,如进程的对换,终端的初启。它们定期执行系统任务并且在这些任务之间睡眠。对于系统进程
44、,启。它们定期执行系统任务并且在这些任务之间睡眠。对于系统进程,在在TTY字段上出现的字符是一个字段上出现的字符是一个“?”。你还会发现:这些进程的。你还会发现:这些进程的PID号相对说来都比较小。号相对说来都比较小。$ps f。可以得到有关你的进程的更详细的信息。其中的。可以得到有关你的进程的更详细的信息。其中的UID表示建表示建立该进程的用户注册名,立该进程的用户注册名,PPID是父进程的是父进程的PID,C是该进程最近试用是该进程最近试用CPU情况的统计,而情况的统计,而STIME则是启动进程的时间,则是启动进程的时间,CMD是执行该进是执行该进程的命令。程的命令。输入输入ps -1命令
45、会得到进程附加属性的长列表信息。命令会得到进程附加属性的长列表信息。输入输入ps -el命令会得到所有进程的附加属性长列表信息。从该表中可命令会得到所有进程的附加属性长列表信息。从该表中可以看出,系统进程的优先级以看出,系统进程的优先级(PRI)比较高;进程有家族关系,如上面比较高;进程有家族关系,如上面输入的命令(输入的命令(ps)对应的进程)对应的进程PID是是729,它的父进程(,它的父进程(sh)的)的PID是是596,而,而596号进程的父进程是号进程的父进程是595号进程,以此类推,结果是:号进程,以此类推,结果是:729-596-595-543-525-355-350-1-09/
46、11/202435所以,所以,0号进程是系统中的第一个进程,它创建了号进程是系统中的第一个进程,它创建了1号进程;号进程;1号进程号进程创建各终端的注册进程,会话进程以及创建各终端的注册进程,会话进程以及shell进程,为用户在终端上输进程,为用户在终端上输入的命令创建相应的进程。入的命令创建相应的进程。(11) su命令命令使用使用su命令实现用户的切换。例如超级用户想要进入用户命令实现用户的切换。例如超级用户想要进入用户user10的目的目录,则需做以下操作:录,则需做以下操作:root10localhost user# su user10 这时屏幕显示:这时屏幕显示:user10$ 若想
47、再回到超级用户的账号,则需做以下操作:若想再回到超级用户的账号,则需做以下操作:user10localhost user$su root这时屏幕显示:这时屏幕显示:Passwd: 这时你键入正确的超级用户密码,则屏幕显示:这时你键入正确的超级用户密码,则屏幕显示:rootlocalhost user# 使用使用su命令会给用户特别是系统管理员带来很多便利。命令会给用户特别是系统管理员带来很多便利。9/11/202436(12) wait命令命令wait命令的功能是等待后台进程结束。如果没有给出参数,则等待当命令的功能是等待后台进程结束。如果没有给出参数,则等待当前进程所创建的全部后台进程的终止
48、。如:前进程所创建的全部后台进程的终止。如:$wait 880 (13) kill命令命令kill命令的功能是终止一个进程的运行。例如:命令的功能是终止一个进程的运行。例如:#kill 808 该命令终止进程标识号为该命令终止进程标识号为808的进程运行。的进程运行。#kill -9 808 该命令强行撤销该命令强行撤销PID为为808的进程。的进程。(14) find命令命令搜寻文件与目录。该命令非常实用,具体细节请参见本书的搜寻文件与目录。该命令非常实用,具体细节请参见本书的3.2.8。$find/home/lin name hash 在在/home/lin目录下找寻名为目录下找寻名为ha
49、sh的文件。的文件。$find / -name fs* -print从根目录开始搜寻所有以从根目录开始搜寻所有以fs开头的文件,再显示符合条件的文件路径。开头的文件,再显示符合条件的文件路径。9/11/202437(15) 浏览文件系统浏览文件系统运行运行pwd命令,确定当前的工作目录。命令,确定当前的工作目录。利用利用ls -1命令显示当前工作目录的内容:命令显示当前工作目录的内容:输入输入ls -ai命令观察显示的信息。前两项分别表示当前目命令观察显示的信息。前两项分别表示当前目录和父目录。看一下是否还有其他的隐藏文件录和父目录。看一下是否还有其他的隐藏文件?使用不带使用不带-a选项的选项
50、的ls命令,注意,不再显示隐藏文件了。使用不带命令,注意,不再显示隐藏文件了。使用不带-i选项的选项的Is命令,注意,文件的命令,注意,文件的i节点号不再出现。节点号不再出现。用用mkdir命令建立一个子目录命令建立一个子目录subdir。使用带使用带-d选项的选项的ls命令,只能看到有关子目录的信息。命令,只能看到有关子目录的信息。使用使用ls命令列出根目录的内容,再分别列出各子目录的内命令列出根目录的内容,再分别列出各子目录的内容。体会各子目录的作用以及访问权限。容。体会各子目录的作用以及访问权限。 使用使用ls -l命令列出命令列出/dev的内容,注意各行第一个字符的内容,注意各行第一个
51、字符b和和c的含义以及规定的访问权限。的含义以及规定的访问权限。9/11/202438(16) 查看文件命令查看文件命令利用利用cd命令,将工作目录改到你的目录上。命令,将工作目录改到你的目录上。将当前日期和时间存放到新建文件将当前日期和时间存放到新建文件file1中。中。使用使用cat命令查看命令查看file1文件的内容。文件的内容。利用利用man命令显示命令显示date命令的用法:命令的用法: man date将将date命令的用法附加到文件命令的用法附加到文件file1的后边:的后边: man datefile1利用利用cat命令显示文件命令显示文件file1的内容。你会看到,前面的内容
52、。你会看到,前面date命令的输出和有关命令的输出和有关date命令用法的信息都在这个文件中。命令用法的信息都在这个文件中。利用利用ln file1./fa命令进行文件连接。然后运行命令进行文件连接。然后运行ls l file1,查看显示的第二个,查看显示的第二个字段的值发生了什么变化。字段的值发生了什么变化。将工作目录移到你的主目录。利用将工作目录移到你的主目录。利用head命令显示命令显示file1前前10行行(这是默认值这是默认值)的的内容:内容:head file1利用利用tail file1命令显示命令显示file1后后10行行(这是默认值的内容这是默认值的内容)的内容。的内容。利用
53、利用cp file1 fa命令生成文件命令生成文件file1的副本。然后利用的副本。然后利用ls -l命令查看当前工作目录命令查看当前工作目录的内容有什么变化。的内容有什么变化。利用利用rm fa命令将文件命令将文件fa删除,再利用删除,再利用ls -l命令查看工作目录的内容。命令查看工作目录的内容。运行运行mv file1 file -a命令,然后用命令,然后用ls命令查看两文件是否还在工作目录中。命令查看两文件是否还在工作目录中。利用利用cat file*命令列出当前工作目录中以命令列出当前工作目录中以file开头的所有文件。开头的所有文件。运行运行cat file?命令,与上面结果相比有
54、何差别命令,与上面结果相比有何差别?9/11/2024395综合练习综合练习(1) 浏览目录和不同文件类型浏览目录和不同文件类型列出你主目录下的文件清单。它们的排列顺序是否有一定的规律列出你主目录下的文件清单。它们的排列顺序是否有一定的规律?使用使用lc -a显示主目录。有哪些文件不遵循显示主目录。有哪些文件不遵循UNIX文件命名习惯文件命名习惯?使用使用ls命令显示主目录。命令显示主目录。使用使用datedatefile命令,将当前日期和时间存放在文件命令,将当前日期和时间存放在文件datefile中。中。使用使用file命令分析文件命令分析文件datefile的类型。的类型。使用使用cat
55、命令显示文件命令显示文件datefile的内容。的内容。使用使用ls -l/binlsfile命令将目录命令将目录/bin的内容输出重定向到文件的内容输出重定向到文件lsfile。使用使用more lsfile命令分屏显示文件命令分屏显示文件datefile的内容。的内容。用绝对路径名形式显示文件用绝对路径名形式显示文件datefile的内容。的内容。分别用分别用head和和tail命令显示文件命令显示文件lsfile的开始的开始10行和最后行和最后10行。行。使用什么命令能确定你的工作目录中各文件的类型使用什么命令能确定你的工作目录中各文件的类型?9/11/202440(2) 创建、拷贝、链
56、接和删除、查找和比较文件创建、拷贝、链接和删除、查找和比较文件pwd命令确认你当前的工作目录是你的主目录。命令确认你当前的工作目录是你的主目录。分别将文件分别将文件datefile和和lsfile拷贝到文件拷贝到文件date.bak和和ls.bak,看一下结果。,看一下结果。分别将文件分别将文件datefile和和lsfile改名为改名为dfile和和lfile,看一下结果。,看一下结果。用一条命令删除所有以用一条命令删除所有以.bak结尾的文件。结尾的文件。在主目录下创建一个名为在主目录下创建一个名为class的子目录,检查它是否在你的主目录下。的子目录,检查它是否在你的主目录下。试创建一个
57、字符名字的目录。你能创建名字为试创建一个字符名字的目录。你能创建名字为/或或.的目录吗的目录吗?将文件将文件/etc/motd拷贝到拷贝到class目录中。将目录中。将who的参考手册页内容存到的参考手册页内容存到class目录下,文件名为目录下,文件名为whoman。检查一下这两个文件是否已经在。检查一下这两个文件是否已经在class目录之下。目录之下。将工作目录改到将工作目录改到class,并用,并用pwd命令确认你是在该目录之下。命令确认你是在该目录之下。将文件将文件dfile从你的主目录拷贝到当前目录,文件名不变。重复这一操从你的主目录拷贝到当前目录,文件名不变。重复这一操作。现在你的
58、当前目录下有几个名为作。现在你的当前目录下有几个名为dfile的文件的文件?解释一下为什么。解释一下为什么。回到主目录并进行确认。回到主目录并进行确认。9/11/202441删除目录删除目录class,在此之前,你要先删除一些文件。如果可,在此之前,你要先删除一些文件。如果可能的话,使用文件名扩展字符。删除你创建的名为一个字能的话,使用文件名扩展字符。删除你创建的名为一个字符的目录。符的目录。从父目录开始,查找有多少名为从父目录开始,查找有多少名为bin的目录的目录(提示:别忘记提示:别忘记用用-name和和-print选项选项)find命令是否报告了出错信息命令是否报告了出错信息?查找在你的
59、主目录中有多少文件包含字符串查找在你的主目录中有多少文件包含字符串the。Grep命命令是否列出除令是否列出除the之外的更多的词昵之外的更多的词昵?如何让如何让grep命令只找命令只找出词出词the而忽略包含字符串而忽略包含字符串the的词的词?创建创建bin目录下的目录下的ls文件到当前工作目录下文件到当前工作目录下newls文件的硬文件的硬链接。链接。运行新命令运行新命令newls。删除文件。删除文件bin/ls。利用。利用l查看对查看对newls文文件的链接情况。件的链接情况。9/11/202442(3) 分配文件与目录权限分配文件与目录权限在你的目录下输入一个命令,查看一下谁拥有这些
60、文件在你的目录下输入一个命令,查看一下谁拥有这些文件?这些文件属于哪个用户组这些文件属于哪个用户组?你能说出哪些是文件,哪些是你能说出哪些是文件,哪些是目录吗目录吗?在在/usr目录下创建子目录目录下创建子目录tmpa。将工作目录移到。将工作目录移到tmpa。使用使用vi编辑命令建立一个新文件,名为编辑命令建立一个新文件,名为words,其中有你,其中有你输入的输入的5行正文。行正文。查看文件查看文件words的权限。的权限。使用使用chmod命令将命令将words文件权限改为文件主可读,其他文件权限改为文件主可读,其他用户无权访问。用户无权访问。将子目录将子目录tmpa的权限改为组用户可以读
61、并且查询此目录,的权限改为组用户可以读并且查询此目录,而其他用户不可以访问该目录。而其他用户不可以访问该目录。设系统中还有其他人的文件,在征得其同意的条件下,试设系统中还有其他人的文件,在征得其同意的条件下,试着删除其目录下的一个文件,为什么其不能删除他的文件着删除其目录下的一个文件,为什么其不能删除他的文件?9/11/20244310.3 实践项目三 vi编辑器练习10.3.1 实验目的实验目的学习使用学习使用vi编辑器建立、编辑、显示文本文件。编辑器建立、编辑、显示文本文件。10.3.2 实验内容实验内容1进入和退出进入和退出vi。2利用文本插入方式建立一个文件。利用文本插入方式建立一个文
62、件。3在新建的文本文件上移动光标。在新建的文本文件上移动光标。4在文本文件执行删除,复原,修改,替换操作。在文本文件执行删除,复原,修改,替换操作。10.3.3 实验步骤实验步骤用户往往需要建立自己的文件,如一般的文本文件,数据用户往往需要建立自己的文件,如一般的文本文件,数据文件,数据库文件,程序源文件等。建立和编辑文本文件文件,数据库文件,程序源文件等。建立和编辑文本文件要利用编辑器。要利用编辑器。UNIX系统提供了多个文本编辑器,如系统提供了多个文本编辑器,如ed,ex edit,vi。按功能上把它们分为两类:行编辑器(如。按功能上把它们分为两类:行编辑器(如ed,ex edit)和全屏
63、幕编辑器(如)和全屏幕编辑器(如vi)。)。9/11/202444Vi的名字取自于的名字取自于visual,意为,意为“直观直观”,它是一个全屏幕文本编辑程,它是一个全屏幕文本编辑程序。在序。在linux系统中系统中vi是最常用的编辑程序,它的文本编辑功能十分是最常用的编辑程序,它的文本编辑功能十分强大,但使用起来比较复杂。初学者可能感到困难,经过一段时间强大,但使用起来比较复杂。初学者可能感到困难,经过一段时间的学习和使用,你就会体会到使用的学习和使用,你就会体会到使用vi非常方便。非常方便。Linux系统中的系统中的vi其其实是实是vim,vim是是vi的增强版,的增强版,vi 的功能的功
64、能vim都有,而且都有,而且vim新增了许新增了许多多vi没有的功能,它比没有的功能,它比vi容易使用。容易使用。vi启动启动在系统提示符下输入在系统提示符下输入vi命令后,便进入全屏幕编辑环境,此时的状命令后,便进入全屏幕编辑环境,此时的状态为命令模式。启动方式有如下几种:态为命令模式。启动方式有如下几种:(1)vi进入进入vi的一个临时缓冲区,光标定位在该区第的一个临时缓冲区,光标定位在该区第1行第行第1列位列位置上。置上。(2)vi file1。如果。如果file1文件不存在,将建立此文件,如果该文件存文件不存在,将建立此文件,如果该文件存在,则将拷贝到一个临时缓冲区。光标定位在该缓冲区
65、第在,则将拷贝到一个临时缓冲区。光标定位在该缓冲区第1行第行第1列列的位置上。的位置上。(3)vi+file。如果。如果file1文件不存在,将建立此文件;如果该文件存文件不存在,将建立此文件;如果该文件存在,则将其拷贝到一个临时缓冲区。光标定位在文件最后在,则将其拷贝到一个临时缓冲区。光标定位在文件最后1行第行第1列列的位置上。的位置上。9/11/2024452退出退出vi建议在推出建议在推出vi前,先按前,先按Esc键,以确保当前键,以确保当前vi的状态为命令的状态为命令方式,然后再输入方式,然后再输入“:”,输入下列命令,退出,输入下列命令,退出vi。(1)w。将编辑缓冲区内容写入文件,
66、新内容替代原始文。将编辑缓冲区内容写入文件,新内容替代原始文件。这时并未退出件。这时并未退出vi,必须继续输入,必须继续输入q命令才能退出。命令才能退出。(2)wq。将上面两步操作合二为一。先执行。将上面两步操作合二为一。先执行w,后执行,后执行q。(3)x和和zz(注意(注意zz前没有前没有“:”)功能与()功能与(2)等价。)等价。(4)q!(或(或quit)。强行退出)。强行退出vi,被更新内容不写回文件。,被更新内容不写回文件。感叹号(!)告诉感叹号(!)告诉vi无条件退出,丢弃缓冲区内容,对该无条件退出,丢弃缓冲区内容,对该文件的修改或输入都无效。文件的修改或输入都无效。9/11/2
67、024463Vi编辑器的工作方式编辑器的工作方式vi编辑器有两种基本工作方式:命令方式和插入方式,默认的是命令编辑器有两种基本工作方式:命令方式和插入方式,默认的是命令模式。模式。命令方式。当在系统提示符下输入命令方式。当在系统提示符下输入vi命令后,即进入命令后,即进入vi全屏幕编辑画全屏幕编辑画面,此时面,此时vi工作在命令方式,输入字符作为执行特定工作在命令方式,输入字符作为执行特定vi命令,能进行命令,能进行的操作由移动光标在屏幕上的位置、标记、删除、移动、复制字符或的操作由移动光标在屏幕上的位置、标记、删除、移动、复制字符或文本区块,还可以将文件写入或退出编辑器,亦可设置编辑环境,如
68、文本区块,还可以将文件写入或退出编辑器,亦可设置编辑环境,如寻找字符串,列出行号等。寻找字符串,列出行号等。Vi编辑器中能使用的命令是规定好的,如编辑器中能使用的命令是规定好的,如a(append)表示附加,表示附加,i(insert)表示插入,表示插入,x表示删除字符等。如果输入表示删除字符等。如果输入字符不是字符不是vi合法命令,则发出报警声,光标不移动。合法命令,则发出报警声,光标不移动。插入方式。通过输入插入命令(插入方式。通过输入插入命令(i),附加命令(),附加命令(a),打开命令(),打开命令(o),),替换命令(替换命令(s),修改命令(),修改命令(c)或取代命令()或取代命
69、令(r)便由命令方式进入插)便由命令方式进入插入方式。在插入方式下,键盘上输入的字符都被插入到正在编辑的缓入方式。在插入方式下,键盘上输入的字符都被插入到正在编辑的缓冲区中,当作该文件正文,输入的可见字符都在屏幕上显示出来,而冲区中,当作该文件正文,输入的可见字符都在屏幕上显示出来,而编辑命令不起作用,仅作为普通字母出现。编辑命令不起作用,仅作为普通字母出现。由插入方式回到命令方式的办法是:按下由插入方式回到命令方式的办法是:按下Esc键(在键盘的左上角)。键(在键盘的左上角)。如果已在命令方式下,按下如果已在命令方式下,按下Esc键会发出键会发出“嘟嘟嘟嘟”声,不会切换到插声,不会切换到插入
70、模式。入模式。9/11/2024474基本基本vi命令命令下面列出的命令都是在命令方式下执行的。下面列出的命令都是在命令方式下执行的。(1)移动光标)移动光标h,j,k,l分别控制光标左,下,上,右移一格分别控制光标左,下,上,右移一格Ctrl+b向后滚动一屏,向后滚动一屏,Ctrl+f向前滚动一屏向前滚动一屏Ctrl+d向前滚动半屏,向前滚动半屏,Ctrl+u向后滚动半屏向后滚动半屏G移到文件最后,移到文件最后,W移到下一个字的开头,移到下一个字的开头,b跳至上一个跳至上一个字的开头字的开头(2)插入。文本插入命令包括插入命令,附加命令和插)插入。文本插入命令包括插入命令,附加命令和插入新行
71、命令。入新行命令。插入命令。命令插入命令。命令i使光标仍定在原来字符上,随后输入的各使光标仍定在原来字符上,随后输入的各个字符插在光标之前,光标及其后的文本相应向右移动。个字符插在光标之前,光标及其后的文本相应向右移动。如果在如果在i命令后输入命令后输入,就插入新的一行或者换行。,就插入新的一行或者换行。当输入当输入I命令时,光标就移到行首,然后在光标所在行的命令时,光标就移到行首,然后在光标所在行的行首插入新增文本。行首插入新增文本。9/11/202448附加命令。当输入附加命令。当输入a命令时,光标右移一个字符,输入的命令时,光标右移一个字符,输入的字符在光标位置之前。当输入命令字符在光标
72、位置之前。当输入命令A后,光标自动移到该后,光标自动移到该行行尾。在光标所在的行的行尾添加文本。行行尾。在光标所在的行的行尾添加文本。a和和A是把文本是把文本添加到行尾的唯一方法。添加到行尾的唯一方法。新行命令。输入命令新行命令。输入命令o后,在光标所在行的下面插入一行。后,在光标所在行的下面插入一行。输入命令输入命令O后,在光标所在行上面插入一行。后,在光标所在行上面插入一行。输入命令输入命令x,删除当前光标所在后面一个字符。输入命令,删除当前光标所在后面一个字符。输入命令dd,删除当前光标所在行,输入命令,删除当前光标所在行,输入命令X删除当前光标的左删除当前光标的左字符,输入命令字符,输
73、入命令D删除至行尾。删除至行尾。输入命令输入命令cw,更改光标处的字到此单字的字尾处。输入命,更改光标处的字到此单字的字尾处。输入命令令cc,用随后输入的字符替换光标所在的整行字符。,用随后输入的字符替换光标所在的整行字符。输入命令输入命令r,由随后输入的单个字符取代光标所在的字符。,由随后输入的单个字符取代光标所在的字符。输入命令输入命令R,用随后输入的文本取代光标位及其右面的若,用随后输入的文本取代光标位及其右面的若干字符,每输入一个字符就替代原有的一个字符。如新输干字符,每输入一个字符就替代原有的一个字符。如新输入数超出原有对应字符数,则多出部分就附加在后面。入数超出原有对应字符数,则多
74、出部分就附加在后面。9/11/202449复制。输入命令复制。输入命令yw,拷贝光标处的字到字尾至缓,拷贝光标处的字到字尾至缓冲区。输入命令冲区。输入命令p,把缓冲区的资料贴上来。输入,把缓冲区的资料贴上来。输入命令命令yy,拷贝光标所在之行至缓冲区。输入命令,拷贝光标所在之行至缓冲区。输入命令#5yy,拷贝光标所在之处以下,拷贝光标所在之处以下5行至缓冲区。行至缓冲区。复原。插入后用复原。插入后用u命令,就会删除刚插入的正文。命令,就会删除刚插入的正文。输入命令输入命令U,把当前行恢复成它被编辑之前的初,把当前行恢复成它被编辑之前的初始状态,不管你把光标移到该行后对它编辑了多始状态,不管你把
75、光标移到该行后对它编辑了多少次少次.输入命令输入命令:100可跳至第可跳至第100行。行。重复命令只是一个圆点(重复命令只是一个圆点(.),它重复刚才的插入),它重复刚才的插入命令或删除命令。命令或删除命令。9/11/2024505使用使用vi查找和替换查找和替换vi提供了几种定位字符串在文中位置的方法,还提供全局替换功能。提供了几种定位字符串在文中位置的方法,还提供全局替换功能。(1) 查找一个字符串查找一个字符串在在vi命令模式下输入命令模式下输入“/”,后面跟要查找的字符串按回车。,后面跟要查找的字符串按回车。Vi将光标将光标定位在该串下一次出现的地方。输入定位在该串下一次出现的地方。输
76、入n跳到该串的下一个出现处,输跳到该串的下一个出现处,输入入N跳到该串的上一个出现处。跳到该串的上一个出现处。在文件中回头查找,使用?代替在文件中回头查找,使用?代替/。输入。输入n跳到该串的上一个出现处。跳到该串的上一个出现处。如果没有找到该串,如果没有找到该串,vi会在屏幕的最后一行显示会在屏幕的最后一行显示pattern nor found。查找通常区分大小写,查找通常区分大小写, 如果忽略大小写则输入如果忽略大小写则输入:set ic。回默认状态。回默认状态:set noic。某些特殊字符(某些特殊字符(/,&,!,.,*,$,?)对查找过程有特殊意义,因此)对查找过程有特殊意义,因此
77、如果这些字符出现在查找串中必须进行转义。为转义一个特殊字符,如果这些字符出现在查找串中必须进行转义。为转义一个特殊字符,需要在该字符前面加一个反斜杠(需要在该字符前面加一个反斜杠()。例如,要查找字符串)。例如,要查找字符串anything?,则输入,则输入/anything ?在按回车键。在按回车键。9/11/202451(2)精确查找字符串在vi中可以通过在字符串中加入特殊字符,从而使得查找更加精确。匹配行首,字符串要以开头。匹配行尾,字符串要以$结束。匹配词首,字符串的串首输入。匹配任意字符,字符串的要匹配的位置输入一个点(.)。例如,查找以search为行首的行,则输入/search;
78、要查找一个以search为行尾的行,则输入/search$。(3)替换一个字符串替换时要指出替换范围(1,n),1和n指行号,n为$时指最后一行。S是替换命令,g代表全程替换。例如,:1,$s/pattern1/pattern2/g指出将行1至结尾的文字,pattern1的字符串改为pattern2的字符串,无g仅更换每一行匹配的第一个字符串,有g则更换所有串。9/11/2024526. 编辑多个文件编辑多个文件将文件将文件filename插入当前文件的插入当前文件的line#行位置。命行位置。命令格式令格式:line# r filename。编辑一系列文件,需要在编辑一系列文件,需要在vi命
79、令后列多个文件名,命令后列多个文件名,中间用空格分开:中间用空格分开:vi file1 file2 file3。输入。输入:n进入进入下一个文件。要想跳转到下一个文件,而不保存下一个文件。要想跳转到下一个文件,而不保存对当前文件所作的修改,则输入对当前文件所作的修改,则输入:n!来代替来代替:n。文件之间的行复制。将行从文件之间的行复制。将行从file1复制到复制到file2,先编,先编辑辑file1,用,用#yy(#代表数字)把要复制的行拷贝代表数字)把要复制的行拷贝到缓冲区,不退出到缓冲区,不退出vi,编辑,编辑file2,输入,输入:n file2再再按按p键,把缓冲区中的内容贴在当前光
80、标位置。键,把缓冲区中的内容贴在当前光标位置。9/11/20245310.4 实践项目四 Shell程序设计10.4.1 实践目的实践目的1.了解了解shell的作用和主要分类。的作用和主要分类。2.了解了解Bourse shell的一般语法规则。的一般语法规则。3.能编写简单的能编写简单的shell程序。程序。10.4.2 实践内容实践内容1.shell变量的定义及使用。变量的定义及使用。2.shell中的特殊符号。中的特殊符号。3.一般控制结构。一般控制结构。4.配置工作环境。配置工作环境。9/11/20245410.4.3 实践步骤实践步骤1.shell变量变量shell有环境变量和临时
81、变量两种。环境变量是永久性的,不随有环境变量和临时变量两种。环境变量是永久性的,不随shell脚脚本执行结束而消失。临时变量是本执行结束而消失。临时变量是shell程序内部定义的,使用范围仅限程序内部定义的,使用范围仅限于定义它的程序,出了本程序就不能再用,当程序执行完毕,它就不于定义它的程序,出了本程序就不能再用,当程序执行完毕,它就不存在了。存在了。在在shell脚本中临时变量又分为两类:用户定义的变量和位置参数。脚本中临时变量又分为两类:用户定义的变量和位置参数。用户定义变量是最普通的用户定义变量是最普通的shell变量,变量名是以字母或下划线打头的变量,变量名是以字母或下划线打头的字母
82、、数字和下划线序列,大小写不同。变量名长度不受限制。一般字母、数字和下划线序列,大小写不同。变量名长度不受限制。一般形式是:形式是:变量名变量名=字符串字符串例如,例如,myfile=/usr/meng/ff/m1.c 其中其中myfile是变量名,是变量名,=是赋值号,字符串是赋值号,字符串/usr/meng/ff/m1.c是赋值。是赋值。注意,在赋值语句中,赋值号的两边没有空格,否则在执行时会引起注意,在赋值语句中,赋值号的两边没有空格,否则在执行时会引起错误。错误。变量值可以改变,只要利用赋值语句重新给它赋值即可。例如变量值可以改变,只要利用赋值语句重新给它赋值即可。例如:myfile=
83、/usr/liu/ex1 此时变量此时变量myfile的值就是的值就是/usr/liu/ex1。9/11/202455在程序中使用变量的值时,要在变量名前加一个符号在程序中使用变量的值时,要在变量名前加一个符号“$”。这个符号告诉。这个符号告诉shell,读取该变量的值,但在行首,读取该变量的值,但在行首的的“$”一般表示系统提示符。一般表示系统提示符。read命令。命令。 在前面例子中已使用过在前面例子中已使用过echo命令,它将其后的命令,它将其后的参数在标准输出(即屏幕)上输出,各参数间以空格隔开,参数在标准输出(即屏幕)上输出,各参数间以空格隔开,以换行符终止。以换行符终止。作为交互式
84、输入手段,可以利用作为交互式输入手段,可以利用read命令由标准输入(即命令由标准输入(即键盘)上读取数据,然后赋给指定的变量。一般格式是:键盘)上读取数据,然后赋给指定的变量。一般格式是:read变量变量1变量变量2 例如:例如:$ read a b c crtvu cn edu $ echo “Email:$a.$c.$b” Email:.edu 9/11/202456利用利用read交互式为变量赋值。输入数据时,数据间以空格交互式为变量赋值。输入数据时,数据间以空格或制表符分割。若变量个数与给定数据个数相同,则依次或制表符分割。若变量个数与给定数据个数相同,则依次对应赋值。若变量个数少于
85、数据个数,则从左至右依次给对应赋值。若变量个数少于数据个数,则从左至右依次给变量赋值,而最后一个变量取得所有余下的数据的值。若变量赋值,而最后一个变量取得所有余下的数据的值。若变量个数多于数据个数,则从左至右依次给变量赋值,后变量个数多于数据个数,则从左至右依次给变量赋值,后面的变量没有输入数据与之对应时,其值为空串。例如:面的变量没有输入数据与之对应时,其值为空串。例如:$ read n1 n2 n3 (用户输入数据)(用户输入数据) First Second $ echo $n1 $n2 $n3 $n4 First Second $ echo $n3 $n4 (输入为空串)(输入为空串)
86、$ 9/11/202457位置参数。在位置参数。在shell中共有中共有10个位置参数,对应名称依次是个位置参数,对应名称依次是$0,$1,$9。其中。其中$0始终表示命令名或始终表示命令名或shell 脚本名。对脚本名。对于命令行必然有命令名,也必定有于命令行必然有命令名,也必定有$0;而其他位置参数依;而其他位置参数依据实际需要,可有可无。例如:据实际需要,可有可无。例如:cp m1.c m2.c m3.c mengqc是把文件是把文件m1.c m2.c和和m3.c拷贝到目录拷贝到目录mengqc中。这里的中。这里的位置参数位置参数$0、$1、$2、$3和和$4分别对应于分别对应于cp、m
87、1.c、m2.c、m3.c和和mengqc。在在shell程序中可以用程序中可以用set为位置参数赋值。在脚本中的命令为位置参数赋值。在脚本中的命令行:行:set m1.c m2.c m3.c就把字符串就把字符串m1.c赋给赋给$1,m2.c赋给赋给$3。但。但$0不能用不能用set命令赋值,它的值总是命令名。命令赋值,它的值总是命令名。预定义的特殊变量。在预定义的特殊变量。在shell中,预定义了几个有特殊含义中,预定义了几个有特殊含义的的shell变量,它们的值只能由变量,它们的值只能由shell根据实际情况赋值,不根据实际情况赋值,不能通过用户重新设置。如:能通过用户重新设置。如:$#用
88、于记录传递给用于记录传递给shell的参数个数,不包含的参数个数,不包含shell过程名本过程名本身。身。9/11/202458$?是最后一条命令执行后的退出状态,称作返回是最后一条命令执行后的退出状态,称作返回值,是一个十进制数,多数命令执行成功都返回值,是一个十进制数,多数命令执行成功都返回0;执行失败则返回非;执行失败则返回非0。例如:输入以下命令,并分析显示结果:例如:输入以下命令,并分析显示结果:$ pwd/usr/mengqc (执行成功)(执行成功)$ echo $? (返回值为(返回值为0)0$*表示在命令中实际给出的位置参数,不限于表示在命令中实际给出的位置参数,不限于9个个
89、位置参数。位置参数。9/11/202459环境变量。这是环境变量。这是shell本身定义的变量,由本身定义的变量,由shell本身维护和使用,与用本身维护和使用,与用户运行的环境有关,如用户主目录、终端类型、命令检索路径等。所户运行的环境有关,如用户主目录、终端类型、命令检索路径等。所有的环境变量都可由用户自己进行重新赋值。下面是接个常用环境变有的环境变量都可由用户自己进行重新赋值。下面是接个常用环境变量的名字和意义:量的名字和意义:HOME 用户注册目录名。用户注册目录名。PATH 指定指定shell在查找命令时的检索路径,由冒号隔开的有序目录路在查找命令时的检索路径,由冒号隔开的有序目录路
90、径名,由径名,由shell初始化为:初始化为:PATH=:/bin/usr/bin。若为了在最后才检索。若为了在最后才检索当前目录,则对当前目录,则对PATH赋值为:赋值为:PATH=/bin:/usr/bin:PS1是指定主提示符的变量。普通用户下是指定主提示符的变量。普通用户下PS1的默认值是的默认值是”$”,在超,在超级用户下,系统默认级用户下,系统默认PS1的值是的值是“#”。LOGNAME表示用户注册名。表示用户注册名。在原有在原有PATH 的基础上,将你的主目录添加在其中(设的基础上,将你的主目录添加在其中(设ps1又恢复原样)又恢复原样):$ PATH=$PATH:$HOME显示
91、显示$HOME、$PATH和和$LOGNAME的值:的值:$ echo $HOME $PATH $LOGNAME9/11/2024602. shell 中的特殊字符中的特殊字符shell中的特殊字符,都有特定含义,如通配符中的特殊字符,都有特定含义,如通配符*、?,管道线、?,管道线 | 及单引及单引号、双引号等。在使用时注意它们表示的意义和作用。号、双引号等。在使用时注意它们表示的意义和作用。通配符用于模式匹配、路径搜索等。常用的通配符有通配符用于模式匹配、路径搜索等。常用的通配符有*、?和、?和三种。三种。连字符仅在一对方括号中表示字符范围,如在方括号外面就成普通字连字符仅在一对方括号中表
92、示字符范围,如在方括号外面就成普通字符了。符了。如果!紧跟在一对方括号的左方括号如果!紧跟在一对方括号的左方括号之后,则表示不在一对方括号之后,则表示不在一对方括号中所列出的字符。例如,中所列出的字符。例如,f!1-9.c表示以表示以f打头、后面一个字符不是数打头、后面一个字符不是数字字19的的.c文件名,它匹配文件名,它匹配fa.c、fb.c、fm.c等。等。在在shell中引号有中引号有3种:双引号、单引号、和倒引号。种:双引号、单引号、和倒引号。双引号括起来的字符,除双引号括起来的字符,除$、倒引号和反斜线(、倒引号和反斜线()仍保留其特殊功能)仍保留其特殊功能外,其余字符通常作为普通字
93、符对待。外,其余字符通常作为普通字符对待。单引号括起来的字符都作为普通字符出现。单引号括起来的字符都作为普通字符出现。倒引号括起来的字符串被倒引号括起来的字符串被shell解释为命令行,在执行时,解释为命令行,在执行时,shell会先执会先执行该命令行,并以它的标准输出结果取代整个倒引号。行该命令行,并以它的标准输出结果取代整个倒引号。反斜线(反斜线()是转义字符,它能把特殊字符变成普通字符。)是转义字符,它能把特殊字符变成普通字符。应注意,在单引号括起来的字符串中,反斜线是普通字符,无转义功应注意,在单引号括起来的字符串中,反斜线是普通字符,无转义功能。能。9/11/2024613. 控制结
94、构控制结构shell具有一般高级程序设计语言的控制结构等复杂功能,如具有一般高级程序设计语言的控制结构等复杂功能,如if、case、循环语句和函数等。主要练习:循环语句和函数等。主要练习:if语句、测试语句、语句、测试语句、while语句、语句、for语句,详细练习请参见本书语句,详细练习请参见本书4.5节。节。4配置你的配置你的shell 环境环境(1)显示你的当前工作目录和)显示你的当前工作目录和HOME环境变量的值。把工作目录改环境变量的值。把工作目录改为上一级目录,再显示为上一级目录,再显示HOME的值。前后两次的结果一样吗?的值。前后两次的结果一样吗?(2)将工作目录改回你的主目录。
95、)将工作目录改回你的主目录。(3)显示你的)显示你的PAHT环境变量。注意:各目录名是以冒号(:)分开环境变量。注意:各目录名是以冒号(:)分开的。在你的系统中查找命令的最后一个目录是什么?的。在你的系统中查找命令的最后一个目录是什么?(4)将你建立的脚本目录从)将你建立的脚本目录从PATH中删除,看看执行脚本时有何问题。中删除,看看执行脚本时有何问题。(5)将)将PS1变量置为你的注册名,看环境变量有何变化。变量置为你的注册名,看环境变量有何变化。(6)将)将PS1恢复成原来位置的值。恢复成原来位置的值。(7)显示)显示profile文件的内容,了解其大体功能。文件的内容,了解其大体功能。9
96、/11/20246210.5 实践项目五 C程序设计与多文件编译10.5.1 实践目的实践目的通过通过vi或或emacs和和gcc的熟练使用,掌握的熟练使用,掌握linux下下C程序的设程序的设计、调试与运行的原理、方法与应用技能。通过进程编程,计、调试与运行的原理、方法与应用技能。通过进程编程,掌握进程程序的设计、调试、运行等以及相关知识。通过掌握进程程序的设计、调试、运行等以及相关知识。通过autotools的练习,掌握使用的练习,掌握使用make的自动安装与压缩文件的的自动安装与压缩文件的制作技术。制作技术。10.5.2 实践要求实践要求1.充分复习教材中有关实验的内容。充分复习教材中有
97、关实验的内容。2.实验前根据实验目的和本人的情况设计出简单程序、分实验前根据实验目的和本人的情况设计出简单程序、分支程序、循环程序;写出实验中要解决的问题。支程序、循环程序;写出实验中要解决的问题。3.把相应的程序上机调试通过。把相应的程序上机调试通过。4.实验之后写出实验报告。实验之后写出实验报告。9/11/20246310.5.3 实践内容实践内容1. 编写一个编写一个c语言源程序,实现从键盘输入语言源程序,实现从键盘输入n个整数,在内个整数,在内存中自小到大排序后输出。要求在存中自小到大排序后输出。要求在emacs中编辑、用中编辑、用gcc编编译连接运行、用译连接运行、用gdb进行调试,
98、记录输出的结果并分析;进行调试,记录输出的结果并分析;2. 文件拷贝功能的程序调试。录入、编辑、调试、运行以文件拷贝功能的程序调试。录入、编辑、调试、运行以下程序,记录程序的运行结果,在每行的后面加注释。下程序,记录程序的运行结果,在每行的后面加注释。#include #include main( )char c;char name120,name220;FILE *fp1,*fp2;9/11/202464printf(“Input sorfilname:”);scanf(“%s”,name1);printf(“Input desfilname:”);scanf(“%s”,name2);fp1
99、=fopen(name1,”r”);if(fp1=NULL) printf(“Cannot open rfile n”);exit (1);fp2=fopen(name2,”w”);if(fp2=NULL) printf(“Cannot open wfile n”); exit (1);while(c=fgetc(fp1)!=EOF)fputc(c,fp2);fclose(fp1);fclose(fp2);printf(“copy complete!n”);9/11/2024653. fork()调用程序调试。录入、编辑、调试、运行程序,记录结果加注释。()调用程序调试。录入、编辑、调试、运行
100、程序,记录结果加注释。#include #include #include #includemain() pid_t pid;printf(Now only one processn);printf(Calling fork.n);pid= fork() ;if (! pid) printf(Im the childn); exit(0); else if (pid0) wait(NULL); printf(Im the parent,child has pid %dn,pid); else printf(Fork fail!n);9/11/2024664. 管道通信程序调试。录入、编辑、调试
101、、运行程序,记录结果并加注释。管道通信程序调试。录入、编辑、调试、运行程序,记录结果并加注释。#include#include#includemain() int fd2,nbytes; pid_t childpid; char string=Hello! 0; char readbuffer80; pipe(fd); if (childpid=fork()=-1) perror(fork);exit(1); if (childpid=0) close(fd0); write(fd1,string,strlen(string); close(fd1); else close(fd1); nby
102、tes=read(fd0,readbuffer, sizeof(readbuffer); printf(Received string:%sn, readbuffer); close(fd0); 9/11/2024675Gdb调试调试Linux特色源于特色源于shell的的GNU调试器,称作调试器,称作gdb。gdb可以查看程序的内部结构、打印显示变量值、可以查看程序的内部结构、打印显示变量值、设断点,单步调试源代码。功能极其强大,适用设断点,单步调试源代码。功能极其强大,适用于调试程序代码中的问题。这里只介绍最基本功于调试程序代码中的问题。这里只介绍最基本功能,建议阅读能,建议阅读gdb手册
103、。手册。9/11/202468下面的清单是一个有错误的C源程序bugging.c。/*- */1#include stdio.h2 3static char buff 256; 4static char* string; 5int main () 6 7printf (Please input a string: ); 8gets (string); 9printf (nYour string is: %sn, string);10 /*- */这个程序简单,目的是接受用户输入,再将用户输入打印出来。其中用了未经初始化这个程序简单,目的是接受用户输入,再将用户输入打印出来。其中用了未经初始化的
104、字符串的字符串string,编译运行后,出现了,编译运行后,出现了Segment Fault 错误:错误: $ gcc -o bugging -g bugging.c $ ./bugging Please input a string: asfd Segmentation fault (core dumped) 9/11/202469为了查找该程序中出现的问题,我们利用为了查找该程序中出现的问题,我们利用 gdb,并按如下,并按如下的步骤进行:的步骤进行:(1)运行)运行 gdb bugging 命令,装入命令,装入 bugging 可执行文件;可执行文件;(2)执行装入的)执行装入的 bug
105、ging 命令命令 run;(3)使用)使用 where 命令查看程序出错的地方;命令查看程序出错的地方;(4)利用)利用 list 命令查看调用命令查看调用 gets 函数附近的代码;函数附近的代码;(5)唯一能导致)唯一能导致gets函数出错的是变量函数出错的是变量string。用。用print查查看看string值;值;(6)在)在gdb中,可以直接修改变量值,只要将中,可以直接修改变量值,只要将string取一取一个合法指针值就可以了,为此,在第个合法指针值就可以了,为此,在第8行处设置断点行处设置断点break 8;(7)程序重新运行到第)程序重新运行到第 8行停止,这时用行停止,这
106、时用set variable命令命令修改修改string值;值;(8)继续运行,将看到正确的程序运行结果。)继续运行,将看到正确的程序运行结果。9/11/2024706多文件自动编译的实现多文件自动编译的实现在在 Unix 上写过程序的人都遇到过上写过程序的人都遇到过 Makefile,尤其是用,尤其是用 C 开发程序的人。用开发程序的人。用 make 开发和编译程序很方便,但要写开发和编译程序很方便,但要写一个一个MakeFile就不简单了,许多人闻就不简单了,许多人闻 Unix色变。这里只色变。这里只介绍如何利用介绍如何利用 GNU Autoconf 及及 Automake 这两款软件帮这
107、两款软件帮助自动产生助自动产生Makefile文件的过程,具体细节请参见本书的文件的过程,具体细节请参见本书的5.6,相信读者再练习一次会更有收获的。,相信读者再练习一次会更有收获的。在开始使用在开始使用Automake前,首先确认系统里安装有如下的前,首先确认系统里安装有如下的几款几款GNU软件:软件:Automake、Autoconf、m4、perl和和Libtool (如果需要生成如果需要生成shared library)。 建议使用建议使用GNU的的C/C+ 编译器、编译器、GNU Make及其它及其它GNU工具程序作为开发环境,这些工具属于工具程序作为开发环境,这些工具属于Open
108、Source Software,免费且功能强大。如果使用,免费且功能强大。如果使用Red Hat Linux可以可以找到所有上述软件的找到所有上述软件的rpm文件,文件,FreeBSD也有现成的也有现成的package可用,也可以自行下载这些软件的源码再安装。可用,也可以自行下载这些软件的源码再安装。9/11/20247110.6 实践项目六 内存动态分区管理10.6.1 实践目的实践目的1.掌握内存动态分区的实现方法。掌握内存动态分区的实现方法。2.进一步掌握内存块的分配策略。进一步掌握内存块的分配策略。3.掌握内存块申请与释放的算法与实现。掌握内存块申请与释放的算法与实现。10.6.2 实
109、践内容实践内容写一个程序写一个程序,模拟实现内存的动态分区分配算法。模拟实现内存的动态分区分配算法。假设内存大小为假设内存大小为100K。1.分别使用首次适应算法、最佳适应算法分配内分别使用首次适应算法、最佳适应算法分配内存空间。存空间。2.实现对内存空间的释放。实现对内存空间的释放。3.显示内存分配情况。显示内存分配情况。9/11/20247210.6.3 实践程序及分析实践程序及分析 本程序的源代码如下:本程序的源代码如下:/* 进入程序后可以根据菜单项进入不同的模块进入程序后可以根据菜单项进入不同的模块 */* 1. 使用首次适应算法分配空间使用首次适应算法分配空间 */* 2. 使用最
110、佳适应算法分配空间使用最佳适应算法分配空间 */* 3. 释放释放-块空间块空间 */* 4. 显示内存分配情况显示内存分配情况 */* 5. 退出系统退出系统 */*-*/#include#include#include#define MEMSIZE 100 /*定义内存大小为定义内存大小为100*/#define MINSIZE 2 /*分配时如果剩余值小于此值则不再分割分配时如果剩余值小于此值则不再分割*/typedef struct MemoryInformation /*空间分区表结构空间分区表结构*/ int start; /*起始地址起始地址*/ int size; /*大小大小
111、*/ char info; /*状态状态:f空闲空闲(FREE): u占用占用(USED); e表结束表结束(END)*/MEMINFO;9/11/202473MEMINFO MemListMEMSIZE;void Display();/*-*/*函数名函数名:InitAll() */*功能功能:初始化所有变量。初始化所有变量。 */*-*/void InitAll() int i; MEMINFO temp=0, 0, e; for(i=0;iMEMSIZE;i+) MemListi=temp; MemList0.start=0; MemList0.size=MEMSIZE; MemList
112、0.info=f;/*-*/9/11/202474/*函数名函数名FirstFit-new() */*功能功能:使用首次适应算法分配内存使用首次适应算法分配内存 */*-*/void FirstFit_new() int i, j, size; char temp10;printf(How many MEMORY do you require?);scanf(%d,&size); for(i=0;i=size&MemListi.info=f) if(MemListi.size-sizei;j-) MemListj+1=MemListj; MemListi+1.start=MemListi.st
113、art+size; MemListi+1.size=MemListi.size-size; MemListi+1.info=f; MemList i.size=size; MemListi.info=u; break; 9/11/202475 if(i=MEMSIZE-1| MemListi.info=e) printf(NOT Enough Memory!n); getchar(); Display();/*-*/9/11/202476/*函数名函数名:BestFit_new() */*功能功能:使用最佳适应算法分配内存使用最佳适应算法分配内存 */*-*/void BestFit_new(
114、) int i, j, k, flag, size; char temp10;printf(How many MEMORY requir?);scanf(%d,&size); j=0; flag=0; k=MEMSIZE; for(i=0;i=size&MemListi.info=f) flag=1; if(MemListi.sizek) k=MemListi.size; j=i; 9/11/202477 i=j; if(flag=0) printf(NOT Enough Memory!n); getchar(); else if(MemListi.size-sizei;j-) MemList
115、j+1=MemListj; MemListi+1.start=MemListi.start+size; MemListi+1.size=MemListi.size-size; MemListi+1.info=f; MemListi.size=size; MemListi.info=u; Display();9/11/202478/*-*/*函数名函数名:del() */*功能功能:释放释放-块内存块内存 */*-*/void del( ) int i, number;printf(Please Input the NUMBER you want to delete:);scanf(%d,&nu
116、mber); if(MemListnumber.info=u) MemListnumber.info=f; if(MemListnumber+1.info=f) MemListnumber.size+=MemList number+1.size; for(i=number+1;iMEMSIZE-1&MemListi.info!=e;i+) MemListi=MemListi+1; if(MemListnumber-1.info!=f) MemListnumber-1.size+=MemListnumber.size; for(i=number;iMEMSIZE-1&MemListi.info!
117、=e;i+) MemListi=MemListi+1; else printf(This Number is NOT exist or is NOT used!n); getchar(); Display();9/11/202479/*-*/* 函数名函数名:Display() */* 功能功能:显示内存状态显示内存状态 */*-*/void Display() int i, used=0; printf(n-n); printf(%5s%15s%15sn, Number, Start, Size, Info); printf(-n); for(i=0;i0)write(fd3,buf,n);
118、/write(fd3,&ch,1);while(n=read(fd2,buf,512)0)write(fd3,buf,n);close(fdl);close(fd2);close(fd3);程序的运行过程与结果如图程序的运行过程与结果如图10.19所示。所示。9/11/2024842. 编写程序,利用编写程序,利用fork调用创建子进程,并让其执行一个可执行文件。调用创建子进程,并让其执行一个可执行文件。main()int pid;pid=fork();if (pid0)/*父进程运行父进程运行*/wait(0); /*等待子进程结束等待子进程结束*/printf(is completedn)
119、;exit(0);if (pid=0)/*子进程运行子进程运行*/execl(/bin/ls,ls,(char)0);/*引入并执行引入并执行ls命令命令*/9/11/202485运行及调试结果见下图10.209/11/2024863.将当前进程及父进程的进程标识号加入将当前进程及父进程的进程标识号加入temp文件,并写入相关信息。文件,并写入相关信息。#include #include #include #include #include #include extern int errno;main() char buf100; int fd,cld_pid; int *status; if
120、 (fd=open(temp,O_CREAT|O_TRUNC|O_RDWR)=-1)9/11/202487/*以读以读/写方式打开写方式打开temp,若该文件存在则长度置,若该文件存在则长度置0,不存在则创建,不存在则创建*/printf(open error %dn,errno);exit(1);strcpy(buf,this is parent process writen);if(cld_pid=fork()=0)/*创建子进程创建子进程*/*子进程执行子进程执行*/strcpy(buf,this is child process writen);/*将字符串将字符串“this is c
121、hild process writen”复制到复制到buf中中*/printf(this is child process n);printf(My PID(child) is %dn, getpid();/*输出子进程标识输出子进程标识*/printf(My parent PID is %dn, getppid();/*输出父进程标识输出父进程标识*/write(fd, buf,strlen(buf);close(fd);exit(0);9/11/202488else/*父进程执行父进程执行*/printf(this is parent process n);printf(My PID(pa
122、rent) is %dn, getpid();/*输出父进程标识输出父进程标识*/printf(My child PID is %dn, cld_pid);/*输出输出父进程标识父进程标识*/write(fd, buf,strlen(buf);close(fd);wait(status);/*等待子进程执行终止等待子进程执行终止*/exit(0);本程序的运行与结果见图本程序的运行与结果见图10.21所示。所示。9/11/20248910.8 实践项目八 系统调用与设备管理10.8.1 实践目的实践目的学习如何通过学习如何通过linux系统调用对设备文件进行操作。系统调用对设备文件进行操作。1
123、0.8.2 实践内容实践内容通过通过ioctl()对时钟设备文件的操作获取系统当前时对时钟设备文件的操作获取系统当前时钟,并显示时钟。系统调用钟,并显示时钟。系统调用ioctl()可以对时钟设备可以对时钟设备进行读写,本实践要求读时钟设备。进行读写,本实践要求读时钟设备。Linux把所有把所有设备当作文件进行操作,所以读写时钟设备即读设备当作文件进行操作,所以读写时钟设备即读写时钟设备文件写时钟设备文件/dev/rtc。时钟信息包括年月日。时钟信息包括年月日时分秒,时分秒,ioctl()读出的时钟信息存放在一个读出的时钟信息存放在一个struct rte_time变量中,可以用变量中,可以用p
124、rintf()显示时钟信息显示时钟信息 9/11/20249010.8.3 实践源程序清单实践源程序清单#include #include #include #include #include void getmonthstr(char *ptr,int month);/*将读得的月份数值转换为英文形式将读得的月份数值转换为英文形式*/main()int fd;struct rtc_time rtctime;/*设置一个存放时钟信息的变量设置一个存放时钟信息的变量*/char cmonth4,dev_name=/dev/rtc;fd=open(dev_name,O_RDONLY);/*以只读方
125、式打开时钟设备文件以只读方式打开时钟设备文件*/if(!fd)/*若无法打开时钟设备若无法打开时钟设备,则显示出错信息则显示出错信息,然后退出程序然后退出程序*/fprintf(stderr,Error opening file!n); exit();9/11/202491if(ioctl(fd,RTC_RD_TIME,&rtctime)=-1)/*读时钟读时钟,不能读则显示出不能读则显示出错信息错信息*/fprintf(stderr,Ioctl failed!n);elsegetmonthstr(cmonth,rtctime.tm_mon);/*将月份值转为英文形式将月份值转为英文形式*/
126、printf(The current time is %d %s %d-%d:%d:%dn,rtctime.tm_mday,cmonth,rtctime.tm_year+1900,rtctime.tm_hour,rtctime.tm_min,rtctime.tm_sec); /*显示时钟信息显示时钟信息*/close(fd);return 0;9/11/202492void getmonthstr(char *ptr,int month) switch(month) case 0:strcpy(ptr,Jan);break; case 1:strcpy(ptr,Feb);break; case
127、 2:strcpy(ptr,Mar);break; case 3:strcpy(ptr,Apr);break; case 4:strcpy(ptr,May);break; case 5:strcpy(ptr,Jun);break; case 6:strcpy(ptr,Jul);break; case 7:strcpy(ptr,Aug);break; case 8:strcpy(ptr,Sep);break; case 9:strcpy(ptr,Oct);break; case 10:strcpy(ptr,Nov);break;case 11:strcpy(ptr,Dec);break; 本程序的运行与结果见图本程序的运行与结果见图10.22所示。所示。9/11/20249394Thank you.Bye Bye,Boys and girls.9/11/202494