您好,欢迎访问三七文档
实验报告(学生打印后提交)实验名称:shell编程基础实验时间:2012年4月14日实验人员:赵俊杰_(姓名)1043041254(学号)2010(年级)实验目的:学习使用Linux的系统调用,对进程进行管理和完成进程之间的通信(用信号和管道进行进程间通信)理解并发程序中的同步问题熟悉使用Linux下的软件开发工具gcc熟练使用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并运行,观察结果,分析程序。实验陈述:1、基础知识:什么是系统调用:Linux所有系统资源被内核管理,任何涉及访问系统资源的用户请求或应用程序请求,必须由内核代码处理。出于安全考虑,用户进程是不能随意访问内核代码的Linux提供系统调用,让用户进程能调用内核代码的运行。这些系统调用允许用户操纵进程、文件和其他系统资源,从用户级切换到内核级。系统调用与普通函数调用的区别在于系统调用的执行会引起特权级的切换,是一种受约束的、为切换到保护核心的“函数调用”。简述fork调用:用它创建一个新的进程,成为原先进程的子进程,原先进程是父进程。子进程实际上是原先进程的一个副本,即子进程拥有和父进程相同代码段的内存块。父子进程在fork语句后都要继续同时执行,它们通过fork的返回值转向不同的代码分支,对子进程的返回值是0,对父进程fork的返回值是子进程的进程号(大于0)。出错返回-1。如何实现进程间的通信:进程间的通信可以利用管道和信号机制实现。信号机制:信号允许一个进程在某一事件发生时与另一个进程(接收者进程)通信,该进程把事件对应的消息传递给接收者进程,接收者进程收到一个信号时,会采取某些相应的动作。信号的值表明发生了哪种事件。管道机制:管道允许一条命令的标准输出作为一条命令的标准输入,允许同一个系统上的两个相关的进程进行通信(典型情形是父子进程),而且进程的通信是单向的。如何实现进程间的连接:2、写出下列函数的原型fork:pid=fork()sigaction:intsigaction(intsignum,conststructsigaction*act,structsigaction*oldact);pipe:intpipe(intpipefd[2]);tcsetpgrp:inttcsetpgrp(intfd,pid_tpgrp)3、运行和观察结果fork.c简述程序实现的功能:程序用创建子进程的方式实现了ls–lh/这个命令的功能,即列出根目录下文件的详细信息.运行结果如下:zjj@ubuntu:~/program$./fork总用量96Kdrwxr-xr-x2rootroot4.0K2012-04-1400:26bindrwxr-xr-x3rootroot4.0K2012-04-2301:18bootdrwxr-xr-x2rootroot4.0K2011-08-1905:18cdromdrwxr-xr-x16rootroot4.0K2012-04-2306:59devdrwxr-xr-x128rootroot12K2012-04-2306:59etcdrwxr-xr-x3rootroot4.0K2011-08-1905:21homelrwxrwxrwx1rootroot332012-04-2301:18initrd.img-boot/initrd.img-2.6.32-41-genericlrwxrwxrwx1rootroot332012-04-1400:30initrd.img.old-boot/initrd.img-2.6.32-40-genericdrwxr-xr-x20rootroot12K2012-04-2301:17libdrwx------2rootroot16K2011-08-1905:14lost+founddrwxr-xr-x3rootroot4.0K2012-04-1401:38mediadrwxr-xr-x3rootroot4.0K2012-03-2305:01mntdrwxr-xr-x2rootroot4.0K2011-08-1905:36optdr-xr-xr-x168rootroot02012-04-2306:58procdrwx------10rootroot4.0K2011-08-1907:41rootdrwxr-xr-x2rootroot4.0K2012-04-1400:26sbindrwxr-xr-x2rootroot4.0K2009-12-0513:55selinuxdrwxr-xr-x2rootroot4.0K2010-08-1602:32srvdrwxr-xr-x12rootroot02012-04-2306:58sysdrwxrwxrwt16rootroot4.0K2012-04-2306:59tmpdrwxr-xr-x10rootroot4.0K2010-08-1602:32usrdrwxr-xr-x15rootroot4.0K2010-08-1602:48varlrwxrwxrwx1rootroot302012-04-2301:18vmlinuz-boot/vmlinuz-2.6.32-41-genericlrwxrwxrwx1rootroot302012-04-1400:30vmlinuz.old-boot/vmlinuz-2.6.32-40-generic程序中如何区分父进程和子进程:Pid=fork().如果pid==0,则为子进程。如果pid!=0,为父进程。pipe.c简述程序实现的功能程序利用管道的形式实现了ls–l/etc|more的功能。将前一个命令的标准输出当做后一个指令(more)的标准输入分页显示/etc目录下文件的详细信息。程序结果如下:zjj@ubuntu:~/program$./pipe总用量1112drwxr-xr-x3rootroot40962012-04-1400:30acpi-rw-r--r--1rootroot29812010-08-1602:34adduser.confdrwxr-xr-x2rootroot40962012-04-1402:10alternatives-rw-r--r--1rootroot3952010-03-0418:29anacrontabdrwxr-xr-x6rootroot40962010-08-1602:40apmdrwxr-xr-x3rootroot40962011-08-1907:43apparmordrwxr-xr-x7rootroot40962012-04-1400:31apparmor.ddrwxr-xr-x5rootroot40962012-04-1400:32apportdrwxr-xr-x6rootroot40962011-08-1905:31apt-rw-r-----1rootdaemon1442010-03-0418:35at.denydrwxr-xr-x3rootroot40962011-08-1907:43avahi-rw-r--r--1rootroot19392010-04-1818:51bash.bashrc-rw-r--r--1rootroot517612010-04-1406:32bash_completiondrwxr-xr-x2rootroot40962012-04-1400:32bash_completion.d-rw-r--r--1rootroot3442010-04-2207:04bindresvport.blacklist-rw-r--r--1rootroot3212010-03-2210:50blkid.conflrwxrwxrwx1rootroot152011-08-1907:30blkid.tab-/dev/.blkid.tabdrwxr-xr-x2rootroot40962010-08-1602:48bluetooth-rw-r--r--1rootroot71352010-04-1504:34bogofilter.cfdrwxr-xr-x2rootroot40962010-08-1602:46bonobo-activation-rw-r--r--1rootroot332010-08-1602:50brlapi.key--More--execvp(prog2_argv[0],prog2_argv)是否执行,如果没有执行是什么原因:该指令执行more的指令signal.c简述程序实现的功能:程序利用信号,实现了进程通信。子程序结束,将SIGCHLD信号返回给父进程,父进程再做出相应的处理。程序结果如图:怎样让函数ChildHandler执行?在另外一个窗口下,执行kill命令,杀死子进程,父进程通过sigaction()系统调用,执行ChildHandler函数。process.c简述程序实现的功能:设置子程序为前台进程组,控制终端调用vi,输入。父程序等待子程序结束后,设为前台进程组,控制终端,回显刚才的输入。程序结果如下:zjj@ubuntu:~/program$./processID(parent=2110)ECHOyourinputs...helloworldECHO:helloworld进程列表中有几个process,为什么?进程列表中有两个process,子程序负责输入,父程序负责回显。杀死主进程后,出现什么情况:杀死主进程后,整个程序退出。实验总结:通过此次实验,了解了与进程同步相关的linux系统调用,掌握了gcc相关命令。熟悉了在linux下程序的调试。理解了进程通信相关问题。并阅读了大量man帮助手册,提高了动手能力,和自主学习能力。
本文标题:操作系统实验报告
链接地址:https://www.777doc.com/doc-5037967 .html