《操作系统》课程实验指导书一.实验总学时(课外学时/课内学时):4/8总学分:8/44必开实验个数:4选开实验个数:0二.适用专业:网络工程、计算机科学与技术2007级三.考核方式及办法:在规定实验时间内完成实验要求,依据实验过程及实验结果在实验现场逐一检查考核。四.配套的实验教材或指导书:自编实验指导书五.实验项目:实验1SHELL命令的使用1、实验目的通过对LINUX的系统启动、注销、关闭和关机,帐号管理,文件系统的日常管理,文件系统的权限控制等常用基本命令的使用及与Windows下DOSSHELL的比较,了解现代操作系统SHELL的特点和功能。了解编辑器vi的使用方法。2、实验工具及环境LINUX系统网络环境或单机,Windows系统网络环境或单机。3、实验计划学时2学时上机实际操作。4、实验内容及操作步骤⑴系统启动和关闭①使用自己的账户登录UNIX系统,查看系统提示符确定自己使用的shell程序类型别。◎开机后,系统自检启动后提示login:(输入:root↙)password:(输入:用户口令↙,root用户为redhat)◎查看/etc/passwd文件可以获得用户使用的shell#grep$LOGNAME/etc/passwd↙可能的显示为:user001:*:200:50::/usr/user001:/bin/sh请思考上述命令怎样得到了当前使用的shell类型的?使用下面的命令也可以查看当前shell:#echo$SHELL②注销和关机命令。◎用户注销使用:$exit↙或$ctrl+D↙或$logout↙◎超级用户关机使用:#shutdown↙该命令将结束所有的进程,当执行此命令后系统提示“SafetoPowerofforPressAnyKeytoReboot”时可以关闭电源或按任一键重启系统。◎haltsys(halt),reboot只能由超级用户在单用户模式下使用。⑵帐号管理①添加用户,删除用户,修改个人口令后重新进行登录;◎添加用户的shell命令:#useradduser08↙(Linux系统中可以为adduser)上述命令采用默认属性,UNIX也可以使用选项来指定创建帐户的属性:-ccomment用户说明-ddirectory指定用户主目录-m若用户的起始目录不存在则创建-ggroup指定用户所属组-sshell指定用户使用的shell-uuid为用户分配标识◎修改口令对linux系统而言,用adduser增加的用户应该随即用passwd命令来修改口令。#passwduser08↙newpassword:(输入口令,屏幕不回显)↙newpassword(again):(再次输入口令)↙◎删除用户的shell命令userdel命令用来删除已经存在的用户及相关的文档,其命令格式如下:#userdel〔选项〕用户名userdel命令的常用选项:-r将用户目录下的文档一并删除。在其他位置上的文档也将一一找出并删除。Userdel不允许移除正在线上的用户帐号,因此,如果想删除这类用户帐号,必须先杀掉用户在系统上运行的程序才能进行帐号删除。②组的添加、删除管理;◎组信息保存在/etc/group文件中,文件记录格式为:userg1::21:user01,user02,user08其中:userg1为组名,组ID号为21,组成员有user01,user02,user08。◎添加用户组可以直接编辑/etc/group文件来创建一个新组。③用who命令查看当前登录在系统中的用户列表、用户总数、系统启动时间等信息;#who-H↙④查看当前用户的标识符及当前进程的状态;#ps–lf|pg↙观察上述命令的输出。⑤用cal命令查看自己的生日是星期几。如:#cal91983↙根据显示可以得到答案。⑶文件系统的日常管理①文件的显示、复制、移动和删除;◎#cat/etc/passwd↙◎#catfilea↙◎#catfilea↙◎#more/etc/filea↙◎#pg/etc/filea↙◎cpfileafileb↙◎mvfilea/fileb↙◎rm/fileb↙②目录的建立、删除、显示、改变和复制◎#mkdirdira↙◎#lsdira↙◎#mkdir–pdirb/dirc↙◎#cp–rdirbdira↙◎ls–Rdira↙◎#rmdir–pdira↙③UNIX系统访问DOS或Windows下文件(FAT),完成读DOS格式的软盘文件或DOS格式的硬盘文件的过程。mount和umount命令。◎以超级用户登录,使用mkdir命令为DOS硬盘创建一个挂载点;#mkdir/mnt/zipdos↙◎用mount命令指定文件系统的类型、设备名称及挂载点:#mount-tmsdos/dev/hdal/mnt/zipdos↙◎挂载完成后可以使用df命令查阅设备挂载的情况;◎完成挂载后,可以在Linux系统下查阅到DOS目录下的文件内容。#cd/nt/zipdos↙#ls◎使用完后使用umount命令进行卸载:#umount/mnt/zipdos↙完成这些操作后,在根目录下除了包含有Linux系统中典型文件系统的内容外,还增加了一个/mnt/zipdos子目录。此目录是将DOS分区中的C盘挂在了Linux系统的根目录下,安装完成后普通用户就可以对其中的文件直接进行访问。在LINUX系统下挂载U盘1)插入U盘2)通常使用mount/dev/sda1/usb即可3)如果不行,输入fdisk-l/dev/sda查看输出结果,在输出信息中查看系统中U盘的Device名称,将前面命令中的sda1改命重新挂载即可。4)如果U盘是fat16就使用下面的命令选项-tmsdos;如果是fat32则为-tvfat。⑷文件系统的权限控制①文件权限的表示◎#ls–l/etc|more↙◎#ls–l/dev|more↙②chmod、chown、chgrp和umask命令;◎#ls–lfilea#chmod640filea↙◎#chownuser08fi1ea↙◎#chgrpuserg1fi1ea↙◎#umask↙/*不带参数的umask显示系统的设置情况*/#mkdirdirx↙#ls–ldirx↙/*查看新建的目录权限*/#umask027↙#mkdirdiry↙#ls–ldiry↙比较有什么不同。(5)在Windows下启动DOSSHELL,即输入CMD运行,对照在Linux下的文件管理操作,完成相应的操作后记录实验结果。(6)使用vi编辑一些文本文件,熟悉vi中的操作命令、工作模式切换及功能键的使用。掌握vi的启动、模式转换、文件的保存、退出操作。◎#vi↙或#vitext1↙◎输入”a,i”进入插入编辑方式◎输入文本后,按“ESC”退回到命令行方式。◎输入“:”进入末行命令方式,再键入“w”,“q”或“wq”存盘或退出。5、实验报告要求认真书写实验报告,报告的内容包括:实验目的、实验内容、实验步骤、实验结果等。思考问题:你觉得LinuxSHELL的命令使用方式与Windows或DOS比较,有何不同?实验二进程管理综合实验1、实验目的熟悉在C语言源程序中使用LIUNX所提供的系统调用的方法;掌握LINUX中子进程的创建方法以及调度执行情况,理解进程与程序的区别;掌握LINUX系统中vi编辑器和gcc编译器的用法;掌握Linux信号量的使用方法和P、V操作函数的定义,掌握使用P、V操作实现进程间的互斥的方法;进一步理解进程同步和互斥的概念;掌握fork()配合exec()使用创建进程的方法,熟悉进程的睡眠、同步、撤消等进程控制方法。通过实验建立起较为完整的进程并发、同步和互斥的概念,对LINUX下进程相关的系统调用有初步的掌握。2、实验工具及环境LINUX系统网络环境或单机,gcc编译器。3、实验计划学时4学时上机实际操作。4、实验内容1)GNUC编译器(1)Linux的基本c开发环境由以下几部分组成:c程序库glibc,c编译器gcc或cc,系统头文件glibc_header,库文件、包含文件和生成的可执行文件存放在/usr/lib目录下。编译连接可用以下的命令进行,假定源程序有两个文件分别是f1.c,f2.c,生成的可执行文件名为hello.exe,缺省目标名称的时候,gcc编译出来的文件是a.out,用“-o”选项可以指定输出文件名,例:#gcc-ohello.exefi.cf2.c更详尽的用法请参考联机帮助。GCC也可以指定编译器处理步骤。-c选项告诉GCC仅把源代码编译为目标代码而跳过汇编和连接步骤。这个选项使用得非常频繁因为它编译多个C程序时速度更快且更易于管理。默认时GCC建立的目标代码文件有一个.o的扩展名。执行程序格式:./可执行文件名例:./hello.exe(2)gdb调试工具LINUX包含了一个叫gdb的GNU调试程序,能在程序运行时观察程序的内部结构和内存的使用情况。它具有以下一些功能:·监视程序中变量的值;·设置断点以使程序在指定的代码行上停止执行;·一行行的执行代码。以下是利用gdb进行调试的步骤:必须使程序在编译时包含调试信息。调试信息里包含程序里的每个变量的类型和在可执行文件里的地址映射以及源代码的行号。gdb利用这些信息使源代码和机器码相关联。在编译时用–g选项打开调试选项。gdb基本命令命令描述file装入欲调试的可执行文件kill终止正在调试的程序list列出产生执行文件的源代码部分next执行一行源代码但不进入函数内部step执行一行源代码并进入函数内部run执行当前被调试的程序quit终止gdbwatch监视一个变量的值而不管它何时被改变break在代码里设置断点,使程序执行到这里时被挂起make不退出gdb就可以重新产生可执行文件shell不离开gdb就执行UNIXshell命令应用举例设有一源程序greet.c编译(gcc-ggdb–ogreetgreet.c)出错,运行gdbgreet,出现提示符(gdb),此时可在提示符下输入gdb的命令,如:(gdb)run(gdb)list用(gdb)quit退出调试状态,返回系统提示符。2)阅读理解下列程序后编译运行,分析得到的结果,与自己的预计有差别吗?反复多次运行后,再观察结果。#includestdio.hmain(){intp1;putchar('x');while((p1=fork())==-1);if(p1==0)putchar('b');elseputchar('a');putchar('y');}3)编写一段程序,使用系统调用fork()创建两个子进程p1和p2。p1显示字符'b',p2显示字符'c',父进程显示字符'a',父进程和两个子进程并发运行。观察并记录屏幕上的显示结果,分析原因。4)阅读理解下列程序后编译运行,子进程中对x重新赋值对父进程有什么影响?得到的结果与自己的预计有什么差别。反复多次运行后,再观察结果。#includestdio.hmain(){intp1;intx=1;while((p1=fork())==-1);if(p1==0){putchar('b');x=9;printf(%d,x);}else{putchar('a');printf(%d,x);}}5)阅读理解下列程序后编译运行,查看程序执行的结果。#includesys/types.h#includesys/wait.h#includeunistd.h#includestdlib.hmain(){pid_tpc,pr;pc=fork();if(pc0)printf(errorocurred!/n);elseif(pc==0){printf(Thisischildprocesswithpidof%d\n,getpid());sleep(10);exit(0);}else{pr=wait(0);printf(Icatchedachildprocesswithpidof%d\n),pr);}exit(0);}6)