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是如何实现父子进程的同步执行的。