欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    Linu并发程序设计实习报告.docx

    • 资源ID:17751654       资源大小:755.20KB        全文页数:25页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Linu并发程序设计实习报告.docx

    1、Linu并发程序设计实习报告实习报告:Linux并发程序设计学生姓名:张云龙 班级:12软工A2 学号:20143430134一、实习内容1、Linux进程控制调试上面7.1 Linux进程控制的各程序代码。1 示例:使用系统调用fork(),创建新进程。一 在linux中打开vi编辑器,新建一个c程序,名字叫做7.1。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.1.c o 7.1对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.1对程序进行编译执行!三通过测试,可以很清楚的知道

    2、,一个进程有2801个子进程!2 示例:使用系统调用getpid(),获得进程标识符一在linux中打开vi编辑器,新建一个c程序,名字叫做7.2。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.2.c o 7.2对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.2对程序进行编译执行!三通过测试,可以很清楚的知道,现在正在运行的进程的ID是2813!3 示例:fork()创建子进程后,子进程在屏幕上显示子进程标识符与父进程标识符。一在linux中打开vi编辑器,新建一个c程序,名字叫

    3、做7.3。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.3.c o 7.3对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.3对程序进行编译执行!三通过测试,可以很清楚的知道,现在正在运行的进程的ID是2834!父进程2863个!4使用execl()系统调用,运行目录列表程序ls。一在linux中打开vi编辑器,新建一个c程序,名字叫做7.4。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.4.c o 7.4对程

    4、序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.4对程序进行编译执行!三通过测试,可以很清楚的知道,该程序实际上是实现了”ls l ”的命令! 5功能改用execv()系统调用完成。一在linux中打开vi编辑器,新建一个c程序,名字叫做7.5。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.5.c o 7.5对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.5对程序进行编译执行!三通过测试,可以很清楚的知道,该程序实际上是实现了”ls l ”

    5、的命令!6使用系统调用fork()与exec,使父子进程运行完全不同的程序。一在linux中打开vi编辑器,新建一个c程序,名字叫做7.6。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.6.c o 7.6对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.6对程序进行编译执行!三通过测试,可以很清楚的知道,该程序实际上是实现了”ls l ”的命令!7使用系统调用exit(),终止进程。一在linux中打开vi编辑器,新建一个c程序,名字叫做7.7。然后将上面的程序代码输入其中!在将程

    6、序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.7.c o 7.7对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.7对程序进行编译执行!三通过测试,可以很清楚的知道,该程序实现了把进程为18188的程序退出的命令!8使用wait()系统调用,实现父子进程的简单同步。一在linux中打开vi编辑器,新建一个c程序,名字叫做7.8。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.8.c o 7.8对程序进行调试!若是没有任何的错误和提醒的话,那么在接着

    7、出现的提示符$后输入命令: ./7.8对程序进行编译执行!三。在等待了大约十秒钟之后,会弹出如下的结果图四。通过测试,我很清楚的知道,该程序实际上是实现了进程等待的命令9系统调用sleep()一在linux中打开vi编辑器,新建一个c程序,名字叫做7.9。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.9.c o 7.9对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.9对程序进行编译执行!三。在等待了大约一分钟之后,会弹出如下的结果图四。通过测试,我很清楚的知道,该程序实际上是实现

    8、了子进程开始睡眠,而父进程等待的命令也就是所谓的程序的挂起!2、Linux进程通信 调试上面7.2 Linux进程通信的各程序代码。事例:在父子进程间建立管道,且子进程向父进程输送信息。一在linux中打开vi编辑器,新建一个c程序,名字叫做7.10。然后将上面的程序代码输入其中!在将程序完整的输入之后!保存程序,并退出!二。然后在提示符$后输入命令:gcc g 7.9.c o 7.9对程序进行调试!若是没有任何的错误和提醒的话,那么在接着出现的提示符$后输入命令: ./7.9对程序进行编译执行!并完成并发程序设计的实验内容:并发程序的设计关键是使用创建进程的系统调用,使一个程序运行时可以生成

    9、几个同时运行的程序,如果程序中没有创建进程的动作则为顺序程序设计。本实验中的并发程序例子完成两个程序child和father之间的数据传递工作,具体做法分为四步。步骤1:编制并发程序pipeline.c。单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为pipeline.c。在该程序中定义管道和文件描述符,并且创建子进程child。该程序用到的系统调用有pipe() 、dup() 、fork() 、close、execl() 、exit,它们的功能分别是建立管道、复制文件描述符、创建进程并使子进程与父进程有相同的程序正文、关闭文件描述符、用指定

    10、文件覆盖调用程序、撤销当前进程。 清单4-5 pipeline.c/ 定义管道程序# define STD_INPUT 0 / 定义标准输入设备描述符# define STD_OUTPUT 1 / 定义标准输出设备描述符int fd2;main()static char process1=father,process2=child; pipe(fd); / 定义管道 pipeline(process1,process2); / 调用自定义函数pipeline() exit(1); / 程序结束pipeline(char* process1,char* process2) int i; whil

    11、e (i=fork()=-1); / 创建进程,直到创建成功为止 if (i) close(fd0); / 关闭管道输入描述符 close(STD_OUTPUT); / 关闭标准输出描述符1 dup(fd1); / 指定标准输出描述符1为管道写指针 close(fd1); / 关闭原始管道写指针execl(process1, process1, 0); / 用程序father覆盖当前程序 printf( father failed.n); / execl()执行失败 else close(fd1); / 关闭管道输出描述符 close(STD_INPUT); / 关闭标准输入描述符0 dup(

    12、fd0); / 指定标准输入描述符0为管道读指针 close(fd0); / 关闭原始管道读指针 execl(process2,process2,0); / 用程序child覆盖当前程序 printf(child failed.n); / execl()执行失败 exit(2); / 程序结束步骤2:编制“管道写”程序father.c作为父进程的一部分工作。其内容如下:单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为father.c。 清单4-6 father.c main() static char string = “Parent is

    13、using pipe write.” ; int len; len = sizeof(string) ; write(l, string, len) ; /* 将string中的内容写入管道中 */ printf(“parent, parent, parent n n n” ) ; exit(0) ; 步骤3:编制“管道读”程序child.c作为子进程的一部分工作。其内容如下:单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中键入程序并保存为child.c。 清单4-7 child.c main() char output30 ; read (0, outpu

    14、t, 30) ; /* 从管道中读数据并存入output中 */ printf(“%s n child, child. n” , output) ; return(0) ; 步骤4:编译。cc o child child.ccc -o father father.ccc -o pipeline pipeline.c步骤5:运行。./pipeline首先单击红帽子,在“GNOME帮助”菜单中单击“附件”-“文本编辑器”命令,在文本编辑中分别键入三个程序。三个程序的程序名分别为pipeline.c,father.c和child.c。若运行不成功,则应该用文本编辑器对源程序进行修改调试。运行显示结果

    15、为: _3、Linux命令接口管理进程步骤1:登录进入GNOME。在Linux登录框中填写指导老师分配的用户名和口令,登录Linux系统。步骤2:访问命令行。单击红帽子,在“GNOME帮助”菜单中单击“系统工具”-“终端”命令,打开“终端”窗口。步骤3:回顾系统进程概念。每个运行的程序都会创建一个进程,进程分配到一个唯一的进程标识符 (PID) 。PID被系统用于标识和跟踪进程,直到进程结束。操作系统内核管理所有进程的初始化和终止。每一个进程都要求系统资源 (例如CPU时间和RAM空间) 在其中工作。当进程启动的时候,操作系统把系统资源分配给每个进程,当进程终止的时候,系统回收这些资源。在Li

    16、nux系统启动的时候,首先启动的两个进程是sched (调度) 和init (初始化) ,它们管理着其他进程。Linux系统中有几种不同类型的进程:守护进程:由Linux内核启动的进程,为了特定目的而存在。例如,lpsched守护进程存在只是为了处理打印作业。父进程:派生其他进程的进程是父进程。一个叫做init的守护进程是第一个调用的进程。每一个进程,除了init之外,都有一个父进程。子进程:由其他进程派生出来的进程叫做子进程。孤儿进程:在进程返回输出之前,它的父进程结束了,这样的进程叫做孤儿进程。僵进程:子进程没有带着输出返回给父进程。这样的进程在系统中变成丢失的进程。使用此前的信息,完成以

    17、下填空:1) Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的_进程标识符(PID)_,用于跟踪从进程启动到进程结束。2) 当启动新进程的时候,内核也给它们分配系统资源,如_内存_和_资源_。3) 永远不向父进程返回输出的进程叫做_僵进程_。4) 由父进程派生出来的进程叫做_子_进程。5) _父_进程是一个派生另一个进程的进程。6) 运行用于提供服务的Linux系统进程是_ 守护进程_。7) 如果父进程在子进程之前结束,它创建了一个_孤儿_进程。步骤4:回顾ps命令和信息。ps命令用于列出当前系统中运行的进程。如果一个进程耗时太长,或者看上去好像已经终止了,表现为一个终端窗口不

    18、再响应或挂起,通常需要使用ps查看系统中的进程。通过列出进程,可以查看初始化进程的命令或程序的名字,以及所有它派生出来的子进程。通过多次执行ps命令,查看进程的时间进程占用的CPU时间,可以检查一个进程是否还在运行。如果时间小再增长,那么进程可能已经终止了。如果进程占用太长的时间或者已经停止,可以使用ps命令检查进程的进程ID (PID) ,然后杀死进程。ps命令的输出将显示PID号和与其相关的命令或程序。PID号通常用于终止一个进程。ps命令 ( ps -options ) 的3个主要选项如下表所示。表3-5 ps命令选项ps选项意义功能Ps无选项显示当前shell或终端窗口中,当前用户的进

    19、程信息ps e每一个显示系统中每一个进程的信息ps f完全产生一个完全列表,给出每个进程的所有可用信息ps -u userid用户显示特定用户的所有进程基本的ps命令显示在当前shell中的进程信息,用户只能够查看在这个终端窗口中初始化的进程。输入ps命令,将结果填入表3-6中。表3-6 实验记录PIDTTYTIMECMD?2367?pts/0?00:00:00Bash?3001?pts/0?00:00:00?ps从当前终端窗口中,练习使用给出的每个选项的ps命令。输入 ps -f 命令,显示运行在系统中的某个进程的完全信息,填入表3-7中。表3-7 实验记录UIDPIDPPIDCSTIMET

    20、TYTIMECMD?root?2937?29350?18:15pts/0?00:00:00bash?root?30032937?018:34?pts/0?00:00:00?ps -fps -f命令输出的各栏标题见表3-8所示。表3-8 ps -f栏标题值描述UID初始化进程的用户IDPID进程的进程标识号。PID可以用来杀死进程PPID 进程的父进程标识号C 进程的优先级STIME进程的启动时间TTY控制进程终端的终端举型TIME进程使用的CPU时间的数量CMD命令名守护进程 (执行的程序的名字)步骤5:列出系统中运行的所有进程。输入 ps -ef 命令,显示运行在系统中的各个进程的完全信息。

    21、执行该命令,并与ps f命令的输出结果对照,一致吗?有何不同?_不一致!用户类型增加了!_注意分析当前终端窗口中的输出结果:a. 显示了多少个进程?_64_b. 进程ID的PID是什么?_进程的进程标识号。PID可以用来杀死进程 _c. 启动进程的命令 (CMD) 是什么?_sched _d. 请观察,什么命令的PID号是1?_intit _e. 再次运行ps ef命令,计算进程的数目:_然后执行下列命令把输出结果输入到wc命令中: ps -ef | wc -l第一个数字显示的是行的数目,也是进程的数目:_64_执行 man ps命令,可以打开Linux用户命令手册,了解ps命令的用法,输入w

    22、q命令可退出用户手册的阅读。man命令可以执行吗?结果如何?_不可以_步骤6:根据命令名搜索特定的进程。为了终止一个进程,必须找到该进程的PID。大多数运行的系统中,有上百个进程在运行,ps -ef的列表可能很长。如果知道启动进程的执行程序的名字,可以更快地找到PID。通过把ps命令的输出结果输入到grep中,可以搜索想要终止的特定进程,确定正确的PID。grep命令可以在其他命令的输出中搜索所有类型的特征字符串。-l (长的输出) 选项将显示和找到的PID相关的进程的名字;-e选项显示PID和初始化命令的名字。a. 单击红帽子,在“GNOME帮助”菜单中单击“游戏”-“堆麻将”命令,打开“堆

    23、麻将”游戏。b. 在当前的终端窗口中,执行命令:ps e | grep mahjongg (“堆麻将”游戏的进程名是“mahjongg”) ,查找和“堆麻将”游戏调度守护进程相关的所有进程。c. 显示了多少个相关进程?_2_d. 显示进程中最小的进程ID号是多少? _2818_c. 在当前终端窗口中执行命令:pgrep l mahjongg查找所有和“堆麻将”游戏调度守护进程相关的进程。ps和pgrep命令输出之间有什么不同? ps e | grep mahjongg命令比pgrep l mahjongg命令输出结果多显示了TTY和TIME _步骤7:确定一个要终止的进程。当试图终止一个程序,

    24、或者释放一个挂起的终端窗口的时候,杀死和不响应的应用相关的PID可能还是不够的,一般需要杀死那个进程的父进程,在少数情况下,甚至要杀死父进程的父进程。为了沿着层次结构,从子进程追溯到派生它们的父进程,必须能够查找PID和PPID。必须首先确定最低级不响应进程的PID。通常,可以试着去杀死那个进程。如果这样做不能够停止那个进程,可能需要杀死它的父进程。杀死父进程将杀死所有它派生的子进程。杀死一个父进程也比杀死几个子进程快得多。1) 在GNOME当前终端窗口中,输入ps命令。有多少进程正在运行?为什么只有这么少的进程? _有2个进程正在运行。因为单前只运行bash和ps这两个程序_2) 正在运行的

    25、进程的名字是什么?它表示什么? _bash和ps。bash是打开终端后自动启动的程序,ps是当前执行的命令。_3) 这个进程的PID是多少? _2836和2868_4) 在bash shell中输入命令csh,打开一个C shell会话,当前系统的会话提示符是什么? _5) 输入 ps -f 命令,显示在当前shell中运行的进程的所有信息。现在什么进程正在运行? _bash,-sh和ps -f_6) bash的PID是-sh (csh) 的PPID吗? _是_7) 输入命令sleep l000&,创建一个进程,把执行挂起1000秒 (大约15分钟) 。&表示在后台运行命令,返回shell提示

    26、符,这样您可以继续工作。8) 再次输入ps -f命令。-sh (csh) 的PID是sleep命令的PPID吗?哪个PID是csh (C shell) 的子进程? _是,sleep 1000 和 ps -f 都是csh (C shell) 的子进程_9) 输入命令 kill -9 退出C shell。然后再次键入ps -f命令。什么PID是sleep父命令的PPID? _0_sleep进程现在是什么类型的进程? _孤儿进程_步骤8:使用kill命令终止一个进程。信号用于终止、挂起和继续进程。有时候使用Ctrl + c可以终止一个不响应的进程。这样向进程发送一个中断 (INT) 信号,终止它及所有它派生的子进程。kill命令提供了一个终止不想要的命令进程的直接方法。当想停止一个运行了很长时间的命令的时候,或者当需要终止一个不能够正常退出的进程的时候,它很有用。指定PID正常地杀死一个进程。 kill -signal process -id为了使用kill命令终止一个进程,应该首先键入ps找出进程的PID,然后键入kill紧跟着PID。如果使用kill而没有指定信号


    注意事项

    本文(Linu并发程序设计实习报告.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开