实验报告(学生打印后提交)实验名称:shell编程基础实验时间:2013年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:intfork(void)sigaction:intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact)pipe:intpipe(intfildes[2])tcsetpgrp:inttcsetpgrp(intfildes,pid_tpgid_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下的一些系统调用函数,如用信号和管道,对进程进行管理和完成进程之间的通信。