实验4 进程控制实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 a 父进程

子进程 图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);

}

相关文档
最新文档