四川大学操作系统课程设计第二次shell编程实验报告

实验报告

(学生打印后提交)

实验名称:   shell编程基础                                               

实验时间:   20## 年 4 月26 日

实验人员:

实验目的:1.学习使用Linux的系统调用,对进程进行管理和完成进程之间的通信(本实验中分别是用信号和管道进行进程间通信);2.理解并发程序中的同步问题;3.熟悉使用Linux下的软件开发工具gcc;4.熟练使用man帮助手册

实验环境:  linux                                                              

实验步骤:

1. 把源文件(程序)拷入Linux系统的一个目录中                                                                         

2. 阅读关于fork、exec、wait、exit、pipe系统调用的man帮助手册                                                                             

3. 编译程序fork.c并运行,观察结果,分析程序。                                                                        

4. 试编辑程序pipe.c运行,观察结果,分析程序。(程序要求及提示见pipe.c源文件)。

5.阅读关于函数sigaction、tcsetpgrp和setpgid的man帮助手册 。                                                                             

6.编译程序signal.c并运行,观察结果,分析程序。                                                                           

7.编译程序process.c并运行,观察结果,分析程序。                                                                             

8.完成实验报告。

实验陈述:

1、基础知识:

²  什么是系统调用:系统调用是Linux操作系统核心提供给用户程序使用的操作系统服务,系统调用主要提供用户程序对文件进行读写,进程的创建,删除和控制以及数据的输入/输出等。  

²  简述fork调用:创建一个新的进程,成为原先进程的子进程,同时子进程拥有和父进程相同代码段,通过fork的返回值转向不同的代码分支的一种函数调用。                                      

²  如何实现进程间的通信:通过管道允许一条命令的标准输出作为一条命令的标准输入,同一个系统上的两个相关的进程可实现相互之间的单向通信(典型情形是父子进程。UNIX进程通信方式还有信号,消息,共享存储区和信号量。

²   

²  如何实现进程间的连接:信号允许一个进程在某一事件发生时与另一个进程(接收者进程)通信,该进程把事件对应的消息传递给接收者进程,接收者进程收到一个信号时,会采取某些相应的动作,这样便实现了进程间的通信。

2、 写出下列函数的原型

fork: int fork(void)                                                                       

sigaction:int sigaction(int signum, const struct sigaction   *act,  

           struct sigaction *oldact)

pipe:int pipe(int fildes[2])                                                                     

tcsetpgrp: int tcsetpgrp(int fildes,   pid_t pgid_id)                                                                

3、运行和观察结果

²  fork.c

Ø  简述程序实现的功能:完成进程创建和执行                                                               

                                                                             

Ø  程序中如何区分父进程和子进程:通过fork的返回值pid的值的大小来区分子进程和父进程,如果pid的值等于0,表明是子进程,如果>0表明是父进程,如果小于0,表明子进程创建失败 。

Ø 

²  pipe.c

Ø  简述程序实现的功能:创建一个管道,把管道的读和写文件描述符

Ø  放到数组fildes中,fildes[0]元素作为管道的读描述

Ø  符, fildes[1]元素作为管道的写描述符。同时重定向到程序中的缓冲,然后用more命令以页为单位在屏幕上显示出重定向的内容。     

execvp(prog2_argv[0],prog2_argv)是否执行,如果没有执行是什么原因:                                                              会执行,父进程创建子进程后父进程和子进程的执行是随机的,所以只要第二次子进程创建成功,都会执行这一句话。

²  signal.c

简述程序实现的功能:不断地输出父进程和子进程的PID号,父进程是2771,子进程是2772。

怎样让函数ChildHandler执行?                                                                

当子进程接收到信号的时候就执行ChildHandler函数                                                                                                                      

²  process.c

Ø  简述程序实现的功能:显示父进程和子进程的ID号,其中父进程的ID号为2813,子进程的ID号为2814,然后使子进程所在的进程组成为前台进程组,同时与控制终端的标准输入相关联,然后执行vi

进程列表中有几个process,为什么?                                    

进程列表中有两个pro,一个是主进程,在后台等待输入,子进程在前台调用vi 。

杀死主进程后,出现什么情况:子进程也结束了。                                                      

实验总结:

1. 学会了在Linux虚拟机下挂载U盘。                                                            

2. 通过本次实验,了解了linux下的软件开发工具gcc的具体使用方法。                                                             

3.学会了使用Linux下的一些系统调用函数,如用信号和管道,对进程进行管理和完成进程之间的通信。

 

第二篇:Shell编程实验报告

南京信息工程大学  实验(实习)报告

【实验目的】

1、了解和熟悉创建并使用脚本的步骤。

2、熟悉bash的控制结构。

3、学会简单的shell编程。

【实验内容】

1、创建一个简单的列目录和日期的shell 脚本并运行之。

步骤:

⑴输入下列命令,创建一个新文件:

cat >new_script

⑵输入下列行:

echo “Your files are”

ls

echo “today is”

date

按回车键将光标移到一个新行,按Ctrl+D键保存并退出。

⑶检查文件内容,确保它是正确的:

cat new_script

⑷运行脚本,输入它的文件名:

new_script

该脚本不运行。

⑸输入下列命令,显示文件的权限:

ls –l new _script

权限表明该文件不是可执行。要通过简单调用文件名来运行脚本,必须有权限。

⑹输入下列命令,使new_script变成可执行文件。

chmod +x new_script

⑺要查看新的权限,输入:

ls –l

现在拥有文件的读、写和执行权限。

⑻输入新脚本的名字以执行它:

new_script

所有输入到文件的命令都执行,并输出到屏幕上。

⑼如果接收到错误信息,比如:

command not found

输入下列命令:

./new_script

该命令行通知shell到哪里寻找shell脚本new_script,即您的当前目录“.”。

程序运行过程如下:

2、用Shell 语言编制一Shell 程序,该程序在用户输入年、月之后,自动打印数出该年该月的日历。

程序运行过程如下:

3、编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同则显示“Match”,并显示“End of program”,如果不同则显示“End of program”。

程序运行过程如下:

4、修改上述程序,编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同显示“Match,不同则显示“Not match”,最后显示“End of program”。<编程提示>请使用ifthenelse 控制结构。

程序运行过程如下:

5、编程使用case 结构创建一个简单的菜单,屏幕显示菜单:

a. Current date and time

b. User currently logged in

c. Name of the working directory

d. Contents of the working directory

Enter a,b,c or d:

根据用户输入选项做相应操作。

shell编程代码如下:

程序运行结果如下:

6、修改上题,使用户可以连续选择直到想退出时才退出。

shell编程代码如下:

程序运行结果如下:

7、编程使用select 结构生成一个菜单如下:

1)apple 3)blueberry 5)orange 7)STOP

2) banana 4)kiwi 6)watermelon

Choose your favorite fruit from these possibilities:

用户输入所选项,如 1 显示:

You chose apple as you favorite.

That is choice number 1.

shell编程代码及运行结果如下:

8、上机编写如下代码,分析下面的程序,简要说明整体功能,并解释每条语句

#!/bin/sh

val=1

while (test $val -lt 6)

do touch file$val

date>>file$val

val=`expr $val + 1`

done

9、编写一段shell程序,根据执行时候获取的当前时间显示出不同的问候信息。

10、用Shell 编程,判断一文件是不是字符设备文件,如果是将其拷贝到/dev 目录下

11、在根目录下有四个文件m1.txtm2.txtm3.txtm4.txt,用Shell 编程,实现自动创建m1,m2,m3,m4 四个目录,并将m1.txt,m2.txt,m3.txt,m4.txt四个文件分别拷贝到各自相应的目录下

【实验小结】

通过几周的实习,我基本上掌握了shell的编程,了解和熟悉创建并使用脚本的步骤;

熟悉bash的控制结构;学会简单的shell编程;能够通过编程实现一些功能,学会了Shell的一些控制语句,测试,Shell变量,Shell的特殊字符等。

当然了,在实习的过程中肯定会遇到很多的困难,但是根据老师的给出的pdf文件,根据上面的说明一步一步的做,问题不大,遇到了实在解决不了的问题,我会去请教老师和同学,把问题解决掉。初步学会了Linux下Shell的编程,为以后更加系统的学习Linux打下了坚实的基础!

相关推荐