试验报告三进程管理及进程通信

上传人:s9****2 文档编号:513653163 上传时间:2023-06-02 格式:DOC 页数:13 大小:172.50KB
返回 下载 相关 举报
试验报告三进程管理及进程通信_第1页
第1页 / 共13页
试验报告三进程管理及进程通信_第2页
第2页 / 共13页
试验报告三进程管理及进程通信_第3页
第3页 / 共13页
试验报告三进程管理及进程通信_第4页
第4页 / 共13页
试验报告三进程管理及进程通信_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《试验报告三进程管理及进程通信》由会员分享,可在线阅读,更多相关《试验报告三进程管理及进程通信(13页珍藏版)》请在金锄头文库上搜索。

1、实验三 进程管理及进程通信实验环境:Linux 操作系统实验目的:(1)利用 Linux 提供的系统调用设计程序,加深对进程概念的理解。(2)体会系统进程调度的方法和效果。(3)了解进程之间的通信方式以及各种通信方式的使用。实验方法:用 vi 编写 c 程序(假定程序文件名为 prog1.c ) 编 译程序$ gcc -o prog1.o prog1.c 或 $ cc -o prog1.o prog1.c 运行$./prog1.o实验内容及步骤:。经过 5 秒钟后,执行实验 1 编写程序。显示进程的有关标识(进程标识、组标识、用户标识等) 另一个程序,最后按用户指示(如:Y/N)结束操作。编程

2、截图:运行结果:| 3 / 3U V Uprocess id :1956process group id : 1956calling processs reall user id : 1955 hello woridid you want it stop the process实验2参考例程i,编写程序。实现父进程创建一个子进程。体会子进程与父进程分 别获得不同返回值,进而执行不同的程序段的方法。例程1 :利用fork()创建子进程/* 用fork()系统调用创建子进程的例子*/main ()int i;if (fork()/*父进程执行的程序段*/i=wait(); /*等待子进程结束*/

3、prin tf(It is pare nt process. n);printf(The child process,ID number %d, is finished.n,i); elsePrintf( “ It is child process.n” );Sleep(10);Exit();运行结果:0stupcl:_ XFile Edit View Search Terminal Helpstupci -$ vi grogl.c$ gcc -o gragl.o grogl.c$ .fprcgi.obas h ; /proglSo such file or directorystupcl T

4、$ Zgrcgl.oIt id child process.It is parent proexo斯*The child processrId number 1799fis finished.思考:子进程是如何产生的?又是如何结束的?子进程被创建后它的运行环境是怎样建立的?答:是由父进程用fock()函数创建形成的,通过 exit()函数自我结束,子进程被创建后核心将其分配一个进程表项和进程标识符,检查同时运行的进程数目,并且拷贝进程表项的数据, 由子进程继承父进程所有文件。实验3参考例程2,编写程序。父进程通过循环语句创建若干子进程。探讨进程的家族树 以 及子进程继承父进程的资源的关系。例程

5、2:循环调用fork()创建多个子进程。/*建立进程树*/#in cludemain () int i;printf( “ My pid is %d, my father s pid is %dn” ,getpid(),getppid();for(i=0; i3; i+) if(fork()=0)printf( “ %d pid=%d ppid=%dn ” , i,getpid(),getppid(); else j=wait(O);Printf( “ %d:The chile %d is fin ished.n” ,getpid(),j);运行结果:stugpcl -$ +/grogZ,oM

6、y pid is 1834Rmy fathers pid is pid =1835 ppid=18341 pid =1836 ppid=183&2 pid =1837 ppld=lS351336:Thechild1837id1835;Thechild讯36id2 pid =1338 ppid=18351835:Thechild1838id1834:Thechild1835idfinished.finished.finished finished.1821.1 pid =1839 ppzd=183A2 pid =1840 ppid=1839 1839 :The child 1S40 id 183

7、4 :The child 1839 id2 pid =1841 ppid=1834 1834 :The child 1841 stupcl $ 口finished,finished,idfinished.思考:实验4参考例程3编程,使用fork()和exec()等系统调用创建三个子进程。子进程分别启动 不同程序,并结束。反复执行该程序,观察运行结果,结束的先后,看是否有不 同次序。例程3:创建子进程并用 execlp()系统调用执行程序的实验 /*创建子进程,子进程启动其它程序*/#in clude#in cludemain ()in t child_pid1,child_pid2,child

8、_pid3;int pid,status;setbuf(stdout,NULL);child_pid仁fork();/* 创建子进程 1*/if(child_pid 1=0) execlp(echo,echo,childprocess 1,(char *)0); /* 子进程 1 启动其它程 序*/perror(exec1 error. n ”); exit(1);/*创建子进程2*/*子进程2启动其它程序*/*创建子进程3*/*子进程3启动其它程序*/child_pid2=fork();if(child_pid2=0) execlp(date,date,(char *)0); perror(

9、exec2 error. n ”); exit(2);child_pid3=fork();if(child_pid3=0) execlp(ls,ls,(char *)0); perror(exec3 error. n ”); exit(3);puts(Pare nt process is wait ing for chile process retur n!); while(pid=wait(&status)!=-1)/* 等待子进程结束 */ if(child_pid1=pid)/* 若子进程 1 结束 */prin tf(child process 1 term in ated with

10、status %dn ,(status8); elseif(child_pid2=pid)/* 若子进程 2 结束 */prin tf(child process 2 term in ated with status %dn,(status8); else if(child_pid3=pid)/* 若子进程 3 结束 */prin tf(child process 3 term in ated with status %dn ,(status8); puts(All child processes termin ated.); puts(Pare nt process term in ated

11、.); exit(0); 运行结果:My pid is 1791 ,my parent15 pid id 17Q0stupcl $ 0 pid = 1792 ppidhi1 pid 二 1793 ppid二】2 pid = 1794 ppid=l思考: 子进程运行其它程序后,进程运行环境怎样变化的?反复运行此程序看会有 什么情况?解释一下。答:子进程运行其他程序后,这个进程就完全被新程序替代。由于并没有产生新进程,所以进 程标识号不变,除此之外的旧进程的其他信息,代码段,数据段,栈段等均被新程序的信息所 替代。新程序从自己的 main() 函数开始进行。 反复运行此程序发现结束的先后次序是不可

12、预知 的,每次运行的结果不一样。原因是当每个子进程运行其他程序是,他们的结束随着其他程序 的结束而结束,所以结束的先后次序在变化。实验 5参考例程 4 编程,验证子进程继承父进程的程序、数据等资源。如用父、子进程修改 公共变 量和私有变量的处理结果;父、子进程的程序区和数据区的位置。例程 4:观察父、子进程对变量处理的影响/* 创建子进程的实验。子进程继承父进程的资源,修改了公共变量 globa 和私有变 量 vari 。 观察变化情况。 */#include#include#includeint globa=4;int main()pid_t pid; int vari=5; printf(

13、before fork.n);if (pid=fork()nd lob-i.Al4K,Tl_01Pb*4 .Fl 事思考:子进程被创建后,对父进程的运行环境有影响吗?解释一下答:父进程被创建后,对父进程的运行环境无影响,因为当子进程在运行时,他有自己 的代码段和数据段,这些都可以做修改。但是父进程的代码和数据段是不会随着子进程数据 段和代码段的改变而改变。实验6参照实验指导第五部分中“管道操作的系统调用”。复习管道通信概念,参考例程5,编写一个程序。父进程创建两个子进程,父子进程之间利用管道进行通信。要求能显示父进程、子进程各自的信息,体现通信效果。例程5:管道通信的实验/*程序建立一个管道fd*/*父进程创建两个子进程P1、P2 */*子进程P1、P2分别向管道写入信息*/*父进程等待子进程结束,并读出管道中的信息 */#i ncludemain

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

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号