实验项目二进程管理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验项目二进程管理

一、实验目的

1.理解进程的概念,掌握父、子进程创建的方法。

2.认识和了解并发执行的实质,掌握进程的并发及同步操作。

二、实验内容

1.编写一C语言程序,实现在程序运行时通过系统调用fork( )

创建两个子进程,使父、子三进程并发执行,父亲进程执行

时屏幕显示“I am father ,”儿子进程执行时屏幕显示“I am son ”,女儿进程执行时屏幕显示“ I am daughter。”

2.多次连续反复运行这个程序,观察屏幕显示结果的顺序,直

至出现不一样的情况为止。记下这种情况,试简单分析其原

因。

3.修改程序,在父、子进程中分别使用wait() 、exit()等系统调用

“实现”其同步推进,并获取子进程的ID 号及结束状态值。

多次反复运行改进后的程序,观察并记录运行结果。

三、源程序及运行结果

源程序 1:

#include

#include

#include

#include

int main()

{

pid_t pid;

char *a;

int num;

printf("starting:\n");

pid = fork();

if (pid == -1)

{

printf("failed");

exit(1);

}

else if (pid == 0)

{

a = "I am son";

}

else

{

a = "I am father";

pid = fork();

if (pid == -1)

{

printf("failed");

exit(1);

}

else if (pid == 0)

{

a = "I am daughter";

}

}

for (num=3;num>0;num--)

{

puts(a);

sleep(1);

}

exit(0);

}

运行结果:

源程序 2:

#include

#include

#include

#include

#include

int main()

{

pid_t pid;

char *message;

int n;

int exit_code;

printf("fork starting.....\n");

pid = fork();

if (pid == -1)

{

printf("fork failed!");

exit(1);

}

else if (pid == 0)

{

message = "I am son";

n = 3;

exit_code = 99;

}

else

{

message = "I am father";

n = 3;

exit_code = 0;

pid = fork();

if (pid == -1)

{

printf("fork failed!");

exit(1);

}

else if (pid == 0)

{

message = "I am daughter";

n = 3;

exit_code = 100;

}

}

for (;n>0;n--)

{

puts(message);

sleep(1);

}

if(pid !=0)

{

int statue;

pid_t child_pid;

child_pid = wait(&statue);

printf("This is the children process: pid = %d\n",child_pid);

if(WIFEXITED(statue))

printf("child exited with code %d\n",WEXITSTATUS(statue));

else

printf("child terminated abnormally!");

}

exit(exit_code);

}

运行结果:

四、实验分析与总结

1.实验内容 1 运行结果为什么无固定顺序, fork() 函数创建进程

是如何并发执行的。

2.实验内容 3 是如何实现父子进程的同步执行的。

答: 1.因为利用fork() 函数创建的三个进程抢占cpu 不同,从而导致三个进程被 cpu 调用执行的顺序不同,从而输出的结果无固定顺序;fork() 函数调用成功后,子进程与父进程并发执行相同的代码,但由

于子进程也继承了父进程的程序指针,所以子进程是从fork()后的语句开始执行,另外fork 在子进程和父进程中的返回值是不同的,

在父进程中返回子进程的PID,而在子进程中返回0,使父进程和子进程执行不同的分支,从而实现了进程的并发执行。

2.该程序段主要使用了函数wait()和exit(),这是因为父进程必须等待两个子进程终止后才终。在父进程中调用wait() 函数,则父进程被阻塞,进入等待队列,等待子进程结束。子进程终止时执行

exit()向父进程发终止信号,当接到信号后,父进程提取子进程的

结束状态值,从wait() 返回继续执行原程序,从而实现了父、子进程

相关文档
最新文档