实验4 进程控制实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四进程控制实验
一、实验目的
1、掌握进程的概念,明确进程和程序的区别。
2、认识和了解并发执行的实质。
3、分析进程争用资源的现象,学习解决进程互斥的方法。
二、实验内容
1、进程的创建
编写一段程序,使用系统调用fork( )创建两个子进程,在系统中有一个父进程和两个子进程活动。让每个进程在屏幕上显示一个字符;父进程显示字符“a”,子进程分别显示字符“b”和“c”。试观察记录屏幕上的显示结果,并分析原因。(1分)
<参考程序>
# include
void main()
{ int p1, p2;
while((p1=fork())= = -1);
if(p1= =0)
putchar(‘b’);
else
{ while((p2=fork())= =-1);
if(p2= =0)
putchar(‘c’);
else
putchar( ‘a’);
}
}
执行结果:
分析:
创建子进程p1,看当前是不是在子进程中,如果在p1中输出b,否则创建子进程p2,如果在子进程p2中输出c,否则在父进程中输出a。
2、修改第一题,在每个进程中显示当前进程识别码和父进程识别码。(2分)
#include
#include
void main(){
int p1, p2;
while((p1= fork()) == -1);
if(p1 == 0){
putchar('b');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d \n",getppid());
}
else
{ while((p2 = fork()) ==-1);
if(p2 == 0){
putchar('c');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d \n",getppid());
}
else{
putchar('a');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d \n",getppid());
}
} }
3、 编写程序创建进程树如图1和图2所示,在每个进程中显示当前进程识别码和父进程识别码。(3分)(写其中一个即可)
图一:
#include
#include
子进程 图1 进程树 b c
d
a d
b
c e
图2 进程树
void main()
{ int p1,p2,p3;
while((p1=fork())==-1);
if(p1==0) /* 子进程1中*/
{ while((p2=fork())==-1);
if(p2==0) /* 子进程2中*/
{ while((p3=fork())==-1);
if(p3==0) /* 子进程3中*/
{putchar('d');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d\n",getppid());}
else
{ putchar('c');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d\n",getppid()); /* 子进程2中*/}
}
else
{ putchar('b');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d\n",getppid()); /* 子进程1中*/}
}
else /* 父进程中*/
{putchar('a');
printf("pid=%d\n",getpid());
printf("My parent’s pid=%d\n",getppid());}}
4、编程创建2个子进程,子进程1运行指定路径下的可执行文件(如:/home/user/birthday),子进程2在暂停10s之后退出,父进程先用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,待收集到第二个子进程结束的信息,父进程就返回。(3分)
#include
#include
#include
#include
#include
#include
int main() {
pid_t child1, child2, child;
if ((child1 = fork()) == -1) {
perror("execle error");
exit(1);
} else if (child1 == 0) {
printf(("In child1:execute'birth'\n"));
if (execle("/home/nmy/abc/birthday.out", " ", NULL, NULL) == -1) { perror("execle error");
exit(1);
}
}
else
//创建子进程2
if ((child2 = fork()) == -1) { //子进程2出错处理
perror("execle error");
exit(1);
} else if (child2==0){ //在子进程2中使其暂停10秒
printf(("In child2:sleep for 10 seconds and then exit'\n"));
sleep(10);
exit(0);
} else{ //在父进程中等待两个子进程的退出
printf("In father process...\n");
child = waitpid(child1,NULL,0); //阻塞式等待
if(child==child1){
printf("Get child1 exitcode\n");
} else{
printf("Error occured!\n");
}
do {
child = waitpid(child2,NULL,WNOHANG); //非阻塞式等待
if(child==0){
printf("The child2 process has not exited\n");
sleep(1); }
}while (child==0);
if(child==child2){
printf("Get child2 exitcode\n");
} else{
printf("Error occured!\n");
}
}
exit(0);
}