实验二 进程管理 - Welcome to SCTS &ampamp; CGCL!.doc

上传人:创****公 文档编号:1856366 上传时间:2019-10-28 格式:DOC 页数:6 大小:44KB
返回 下载 相关 举报
实验二 进程管理 - Welcome to SCTS &ampamp; CGCL!.doc_第1页
第1页 / 共6页
实验二 进程管理 - Welcome to SCTS &ampamp; CGCL!.doc_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《实验二 进程管理 - Welcome to SCTS &ampamp; CGCL!.doc》由会员分享,可在线阅读,更多相关《实验二 进程管理 - Welcome to SCTS &ampamp; CGCL!.doc(6页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、实验三实验三 进程管理进程管理1目的和要求目的和要求 通过进程的创建、控制和通信的设计达到下述目的:(1) 加深对进程概念的理解,明确进程和程序的区别; (2) 进一步认识并发(共行)执行的概念,区别顺序执行和并发(共行)执行;(3) 分析进程争用临界资源的现象,学习解决进程互斥的方法;(4) 了解 UNIX 或 Linux 系统中进程通讯的基本原理。 2实验内容实验内容(1) 进程的创建 编制一段程序,使用系统调用 fork( )创建两个子进程,这样在此程序运行时,在系统中就有一个父进程和两个子进程在活动。让每一个进程在屏幕上显示一个字符:父进程显示字符 a,子进程分别显示字符 b 和字符

2、c。试观察,记录并分析屏幕上进程调度的情况。 (2) 进程的控制 修改已编制的程序,将每个进程输出一个字符修改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析出现问题的原因,进一步理解各个进程争夺临界资源的情况。如果在程序中使用系统调用 locking( )来给每一个进程加锁,可以实现进程之间的互斥,试观察并分析出现的现象。(3) 进程的软中断通讯 编制一段程序,实现进程的软中断通讯:使用系统调用 fork( )创建两个子进程;再使用系统调用 signal( )让父进程捕捉键盘上来的中断信号(即按 Del 键);在捕捉到中断信号后,父进程用系统调用 kill( )向两个子进程发信

3、号;子进程捕捉到信号后分别输出下列信息后终止:Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程都终止以后,输出如下信息后终止: Parent process in killed! (4) 进程的管道通讯 编制一段程序,实现进程的管道通讯:使用系统调用 pipe( )建立一条管道线;两个子进程分别循环向这条管道写一句话:Child 1 is sending a message! Child 2 is sending a message! 而父进程则循环从管道中读出信息,显示在屏幕上

4、。3实验环境实验环境(1)PC 兼容机 (2)Linux 系统4实验提示实验提示 (1) 用 4 个基本系统调用实现进程的创建,执行和自我终止: fork()创建一个子进程。用它创建的子进程是 fork 调用者进程(即父进程)的复制品,即进程映象。除了进程标识数以及与进程特性有关的一些参数外,其它与父进程相同,与父进程共享文本段和打开的文件,并都受进程调度程序的调度。如果创建进程失败,则 fork()返回值为-1;若创建进程成功,则从父进程返回值是子进程号,从子进程返回的值是 0,返回值在 R0。m=fork()。 wait()父进程处于阻塞(或等待)状态,等待子进程执行完成终止后继续工作。其

5、返回值 R0 为等待子进程的子进程号。n=wait()。 exit()子进程自我终止,释放所占资源,通知父进程可以删除自己。此时它的状态变成 P_state=SZOMB。 getpid()获得进程的标识数(进程号),一般是正整数。P=getpid()。编程示例: 例 1:编写一个程序,父进程生成一个子进程,父进程等待子进程 wait(),子进程执行完成后自我终止 exit(),并唤醒父进程。父、子进程执行时打印有关信息。main() int i,j,k; if (i=fork() / 非零值 j=wait(); printf(“Parent process!n“); printf(“i=%d

6、k=%dn”,i,k); else k=getpid(); printf(“Child process!n“); printf(“i=%d k=%dn”,i,k); 例 2. 编写一个程序,输入两个整数并求和输出,然后创建一个子进程,当进程调 度程序调度到父进程或子进程时特输出不同的信息。main() int i,j,k,sum; scanf(“%d%d“, sum=j+k; printf(“sum=%dn“,sum); while(i=jork()=-1) printf(“i=%dn”,i); if (i) printf(“It is parent process!n“); else pri

7、ntf(“It is Child process!n“); 实验题实验题 1. 编写一个程序,用编写一个程序,用 fork()创建创建 2 个子进程。让每个进程在屏幕上显示个子进程。让每个进程在屏幕上显示 一个字符:父进程显示字符一个字符:父进程显示字符 a,子进程分别显示字符,子进程分别显示字符 b 和字符和字符 c。先对例。先对例 1 和例和例 2 进行运行,了解各个系统调用的使用,再做本实验题进行运行,了解各个系统调用的使用,再做本实验题 1。观察,记录并分析屏。观察,记录并分析屏 幕上进程调度的情况。幕上进程调度的情况。(2) 进程的“软中断”通信 它可用于同一用户的进程之间通信。其方

8、式是:一个进程通过系统调用 kill(pid,sig) 向同一用户的其它进程 pid 发送一个软中断信号;另一进程通 过系统调用 signal(sig,func)捕捉到信号 sig 后,执行予先约定的动作 func,从 而实现这两个进程间的通信。 发送信号 kill(pid,sig),本进程将指定信号 sig 发送给指定进程 pid, 其中参数为 pid 进程号,pid 与 sig 均为整数值. 接收信号 signal(sig,func),本进程接收到其它进程发送给它的信号后, 完成指定的功能 func.func 一般是函数. 例 3. 编写一个程序,父进程生成子进程,父进程发送信号并等待,子

9、进程接收信 号并完成某种功能,然后自我终止并唤醒父进程. int func(); main() int i,j: signal(17,func); if(i=fork() printf(“Parent: Signal 17 will be send to Child! n“); kill(i,17); wait(0); printf(“Parent: finished! n“); else sleep(10); printf(“Child: A signal from my Parent is received! n“) ;exit(); func() printf(“It is signal

10、 17 processing function! n“); 执行结果如下: Parent: Signal 17 will be send to Child! It is signal 17 processing function! Child: A signal from my Parent is received! Parent: finished! 在程序中系统调用 sleep(second)用于进程的同步与互斥,自变量是暂停秒 数.其功能是使现行进程暂停执行由自变量规定的秒数. 类似的系统调用有 pause(),它的功能是暂停执行本进程,等待 kill 发来的 信号,收到信号后再继续执行

11、. 在特殊情况下,常用到如下语句 signal(SIGINT,SIG_IGN).它表示遇到了中 断信号 SIGINT(按 Del 键).本进程不做任何动作,即勿略该中断信号对本进程的 影响. 实验题实验题 2. 编写一个程序,实现进程的编写一个程序,实现进程的“软中断软中断“通信。使用系统调用通信。使用系统调用 fork()创建创建 2 个子进程,再使用系统调用个子进程,再使用系统调用 signal()让父进程捕捉键盘上来的中断信号让父进程捕捉键盘上来的中断信号(即按即按 Del 键键),在捕捉到中断信号后,父进程用系统调用,在捕捉到中断信号后,父进程用系统调用 kill()向向 2 个子进程

12、发信号,个子进程发信号, 子进程捕捉到信号后分别输出下列信息后终止:子进程捕捉到信号后分别输出下列信息后终止: Child process 1 is killed by parent ! Child process 2 is killed by parent ! 父进程等待父进程等待 2 个子进程都终止后,输出如下信息后终止:个子进程都终止后,输出如下信息后终止: Parent process is killed ! (3) 进程的控制 利用系统调用 lockf(fd,mode,size),对指定文件的指定区域(由 size 指示) 进行加锁或解锁,以实现进程的同步与互斥.其中 fd 是文件描

13、述字;mode 是锁定 方式,=1 表示加锁,=0 表示解锁,size 是指定文件 fd 的指定区域,用 0 表示从当 前位置到文件尾. 常用程序段 fd = open( “a.out“,2 ); i = fork(); if( i=0 ) lockf(fd,1,0); lockf(fd,0,0); 例 4. 编写一个程序,创建一个文件,文件名为 lock.dat,同时父进程创建 2 个子进程,通过系统调用 lockf(),分别让 2 个子进程对文件加锁,再输出有关信 息,然后解锁. char buf=“check lock!n“; main() int i,p1,p2,fd; fd=crea

14、t(“lock.dat“,0644); write(fd,buf,20); while(p1=fork()=-1); if(p1=0) lockf(fd,1,0); for (i=1;i=3;i+) printf(“child1!n“); lockf(fd,0,0); elsewhile(p2=fork()=-1); if (p2=0) lockf(fd,1,0); for (i=1;i=4;i+) printf(“child2!n“); lockf(fd,0,0); else printf(“parrent!n“); close(fd); 实验题实验题 3. 编写一个程序,用系统调用编写一个

15、程序,用系统调用 fork()创建创建 2 个子进程。让每个进程输出个子进程。让每个进程输出 一句话,并利用系统调用一句话,并利用系统调用 lockf 在各进程执行时摈制加锁。观察程序执行时屏在各进程执行时摈制加锁。观察程序执行时屏 幕上出现的现象,并说明原因。幕上出现的现象,并说明原因。 (4) 进程管道的通信 建立进程间的管道,格式为: pipe(fd); int fd2; 其中,fd1 是写端,向管道中写入; fd0 是读端,从管道中读出; 本质上将其当作文件处理.进程间可通过管道,用 write 与 read 来传递数据,但 write 与 read 不可以同时进行,在管道中只能有 4

16、096 字节的数据被缓冲. 例 5. 编写一个程序,建立一个 pipe,同时父进程产生一个子进程,子进程向 pipe 中写入一个字符串,父进程从中读出该字符串,并每隔 3 秒种输出打印一次. main() int x,fd2; char S30; pipe(fd); for (;) x=fork(); if (x=0) sprintf(S,“Good-night!n“); write(fd1,S,20); sleep(3); exit(0); elsewait(0); read(fd0,S,20); printf(“*n“,S); 实验题实验题 4. 编写一段程序,实现进程的管道通信。使用系统调用编写一段程序,实现进程的管道通信。使用系统调用 pipe()建立一条建立一条 子管道线,子管道线,2 个子进程分别循环向这条管道写一句话:个子进程分别循环向这条管道写一句话: child1 is sending a message! Child2 is sending a message! 而父进程则循环从管道中读出信息而父进程则循环从管道中读出信息,显示在屏幕上显示在屏幕上.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com