实验项目二进程管理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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() 返回继续执行原程序,从而实现了父、子进程