ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:755.32KB ,
资源ID:13198906      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-13198906.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

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

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

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

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

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 ”的命令!6使用系统调

5、用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; while (i=fork(

11、)=-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(fd0); / 指定

12、标准输入描述符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 using pipe

13、 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, output, 30) ; /

14、* 从管道中读数据并存入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。若运行不成功,则应该用文本编辑器对源程序进行修改调试。运行显示结果为: _3、Linu

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

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

17、ux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的_进程标识符(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或终端窗口中,当前用户的进程信息ps e每一个

19、显示系统中每一个进程的信息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 实验记录UIDPIDPPIDCSTIMETTYTIMECMD?

20、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 命令,显示运行在系统中的各个进程的完全信息。执行该命令,并与ps

21、 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命令的用法,输入wq命令可退出用户手册

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

23、当前的终端窗口中,执行命令: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而没有指定信号,则信号15 (SI

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

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