2024年1月15日发(作者:)
实验项目二 进程管理
一、 实验目的
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 *message;
int n;
printf("Fork函数程序运行:n");
pid = fork();
if (pid == -1)
{
perror("fork failed");
exit(1);
}
else if (pid == 0)
{
message = "I am son";
n = 4;
}
else
{
message = "I am father";
n = 4;
pid = fork();
if (pid == -1)
{
perror("fork failed");
exit(1);
}
else if (pid == 0)
{
message = "I am daughter";
n = 4;
}
}
for (;n>0;n--)
{
puts(message);
sleep(1);
}
exit(0);
}
运行结果:
源程序2:
#include
#include
#include
#include
#include
int main()
{
pid_t pid;
char *message;
int n;
int exit_code;
printf("Fork函数程序运行:n");
pid = fork();
if (pid == -1)
{
perror("fork failed");
exit(1);
}
else if (pid == 0)
{
message = "I am son";
n = 4;
exit_code = 1;
}
else
{
message = "I am father";
n = 4;
exit_code = 0;
pid = fork();
if (pid == -1)
{
perror("fork failed");
exit(1);
}
else if (pid == 0)
{
message = "I am daughter";
n = 3;
exit_code = 2;
}
}
for (;n>0;n--)
{
puts(message);
sleep(1);
}
if(pid !=0)
{
int stat_val;
pid_t child_pid;
child_pid = wait(&stat_val);
printf("child has finished: PID = %dn",child_pid);
if(WIFEXITED(stat_val))
printf("child exited with code %dn",WEXITSTATUS(stat_val));
else
printf("child terminated abnormally");
}
exit(exit_code);
}
运行结果:
四、 实验分析与总结
1. 实验内容1运行结果为什么无固定顺序,fork()函数创建进程是如何并发执行的。
2. 实验内容3是如何实现父子进程的同步执行的。


发布评论