预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

实验一 进程的创建与并发执行 实验目的 (1)熟悉Linux工作环境和GCC工具 (2)加深对进程概念的理解,明确进程和程序的区别 (3)进一步认识并发进程的实质和特征 实验器材 微型计算机、Ubuntu版本的Linux系统 实验内容 任务1:进程创建 编写一段程序,让父进程产生两个子进程,父进程显示字符“a”、两个子进程,分别显示字符“b”、“c”。运行程序,观察并分析运行结果。 程序源代码如下: #include<stdio.h> main() { intp1,p2; while((p1=fork())==-1); //父进程创建第一个进程,直到成功 if(p1==0) //0返回给子进程1 putchar('b'); //P1的处理进程 else //正数返回给父进程(子进程号) { while((p2=fork())==-1); //父进程创建第二个进程,直到成功 if(p2==0) //0返回给子进程2 putchar('c'); //P2的处理过程 else putchar('a'); //P2创建完成后,父进程的处理过程 } } 程序运行截图如下: 程序运行结果分析:首先进程main作为父进程创建第一个进程p1,此时存在p1和main两个进程,分别为父进程和子进程,所以它们的p1分别为大于0和等于0。这两个进程分别执行下面的if函数体。当子进程执行时,打印出50000次childA;当父进程执行时,又创建了一个新的子进程p2,接下去的执行和原先的p1和main进程相同。所以最终系统中存在了4个进程,其中一个进程为终端,另外3个进程分别打印属于自己的内容。 任务2: 将上述的输出字符改为输出较长的字符串,观察进程并发执行,分析执行结果。 程序源代码如下: #include<stdio.h> main() { intp1,p2,i; while((p1=fork())==-1); //父进程创建第一个进程,直到成功 if(p1==0) for(i=0;i<50000;i++) printf("childA%d\n",i); else { while((p2=fork())==-1); //父进程创建第二个进程,直到成功 if(p2==0) for(i=0;i<50000;i++) printf("childB%d\n",i); else //P2创建完成后,父进程的处理过程 for(i=0;i<50000;i++) printf("parent%d\n",i); } } 程序运行结果截图如下: 运行结果分析:首先进程main作为父进程创建第一个进程p1,此时存在p1和main两个进程,分别为父进程和子进程,所以它们的p1分别为大于0和等于0。这两个进程分别执行下面的if函数体。当子进程执行时,打印出50000次childA;当父进程执行时,又创建了一个新的子进程p2,接下去的执行和原先的p1和main进程相同。所以最终系统中存在了4个进程,其中一个进程为终端,另外3个进程分别打印属于自己的内容。 思考题解答(包括需要改写的程序的源码及适当注释) 当新创建进程开始执行时,指令指针的起始位置在哪里? 答:创建新进程之后,此时有main和p1两个进程,它们分别根据他们是子进程还是父进程执行不同的if函数体,所以指令指针的起始位置在“if(p1==0)”这一句。 如果将任务1改为:编写一段程序,让父进程创建一个子进程,然后父进程显示字符“a”;子进程创建一个子子进程,然后显示字符“b”;子子进程显示字符“c”。如何改写源程序?(实验报告上给出完整的源码,并在机器上运行。) 答:修改后的源代码如下: #include<stdio.h> main() { intp1,p2; while((p1=fork())==-1); //父进程创建一个子进程,直到成功 if(p1==0) //0返回给子进程 { //P1的处理过程 while((p2=fork())==-1); //子进程创建子子进程,直到成功 if(p2==0) putchar('c'); //子子进程P2的处理过程 else putchar('b'); } else { putchar('a'); //子子进程创建完成后,父进程的处理过程 } } 修改后的运行结果如下: