操作系统实验指导书(3)

2018-12-20 23:02

操作系统实验指导书

实验4 vi编辑器及shell编程

1.实验目的

熟练掌握LINUX环境下C语言编译工具vi的使用,会编写和执行shell程序。

2.实验设备

计算机、安装了Linux的虚拟机。

3. 实验内容及要求

(1)vi的进入与退出;

(2)Linux的编译器 gcc的作用; (3)shell程序的编写和执行。

4.实验步骤

4.1 vi的进入与退出

若要编辑文件 myfile,执行如下指令即可: $vi myfile

如果在输入模式下,则先利用 ESC 进入命令模式,而后即可选用下列指令退出 vi::q!/:wq/:ZZ/:x/:w/:q

4.2 Linux 的编译器 gcc

命令格式:gcc [选项] 源文件 [目标文件] 例:编译hello.c源文件 $gcc hello.c –o hello

将hello.cpp编译为目标代码: $gcc –c hello.cpp –o hello.o

链接指定的函数库中的目标代码和包含头文件,编译程序:

$gcc myapp.c –L /home/xuhong/lib –I /home/xuhong/include –lnew myapp

4.3 shell 程序的编写和执行

(1)编写 shell程序

$vi first

8

操作系统实验指导书

#!/bin/bash # My first shell script # clear

echo \

(2)执行 shell 程序

A.将 shell 程序作为 sh 的输入 例:$sh first

B.利用输入重定向

命令格式:bash

由于 shell 程序是用 vi 编写的文本文件,系统赋予的许可权限都是 644(rw-r-r--),需要用chmod 命令使 shell 程序成为可执行的,然后只需要直接键入文件名即可。

程序1:显示从1~8的整数,并在大于4的整数后面显示字符串“after continue” #!/bin/sh I=1

while [ $i –le 8 ] do

echo “number =$i” if [ $i –gt 4 ]; then echo “after continue.” fi

i=`expr $i + 1` done

程序2:从命令行输入一个简单的算术表达式,计算结果。 #!/bin/sh

if test $# -eq 3 then

case $2 in

+) let z=$1+$3;; -) let z=$1-$3;; /) let z=$1/$3;; x|X) let z=$1*$3;;

*) echo “ Warning - $2 invalied operator, only +,-,x,/ operator allowed.” exit;; esac

echo “ Answer is $z” else

echo \ value1 operator value2\ fi

5.拓展训练

若输入的参数x是正数,显示:x number is positive。

9

操作系统实验指导书

#!/bin/sh

If test $1 –gt 0 then

echo “$1 number is positive” fi

10

操作系统实验指导书

实验5进程管理实验

1.实验目的

熟加深对进程概念的理解,明确进程和程序的区别;进一步认识并发执行的实质。

2.实验设备

计算机、安装了Linux的虚拟机。

3. 实验内容及要求

(1)进程的创建:编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”;

(2)进程的控制:修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。

4.实验步骤

4.1进程的创建

编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。

〈程序〉

#include main() {

int p1,p2; if(p1=fork()) /*子进程创建成功*/ putchar('b'); else { if(p2=fork()) /*子进程创建成功*/ putchar('c'); else putchar('a'); /*父进程执行*/ } }

11

操作系统实验指导书

<运行结果>

bca(有时会出现bac)

分析:从进程执行并发来看,输出bac,acb等情况都有可能。

原因:fork()创建进程所需的时间多于输出一个字符的时间,因此在主进程创建进程2的同时,进程1就输出了“b”,而进程2和主程序的输出次序是有随机性的,所以会出现上述结果。

4.2进程的控制

修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。

如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。

〈程序2〉

#include main() { int p1,p2,i; if(p1=fork()) {

lockf(1,1,0);

for(i=0;i<500;i++) printf(\ lockf(1,1,0); } else { if(p2=fork()) { lockf(1,1,0); for(i=0;i<500;i++) printf(\ lockf(1,1,0); } else { lockf(1,1,0); for(i=0;i<500;i++) printf(\ lockf(1,0,0); } } }

大致与未上锁的输出结果相同,也是随着执行时间不同,输出结果的顺序有所不同。

分析:因为上述程序执行时,不同进程之间不存在共享临界资源(其中打印机的互斥性已有由操作系统保证)问题,所以,加锁与不加锁效果相同。

12


操作系统实验指导书(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:《伯牙绝弦》 教案反思

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: