操作系统实验指导书
实验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 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 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