实现工具:PC机
实现环境:Linux
实习内容(功能、目标):
实验目的:
创建进程,体会进程间的并发特征。
实验内容:
编写一段程序,使用系统调用 fork() 创建两个子进程 p1 和 p2。而且父进程输出字符串“ father ”,第一个子进程输出字符串“ borther1 ”,第二个子进程输出字符串“ borther2 ”。
实验要求:
(1)掌握系统调用 fork() 的使用方法及其功能;
(2)利用系统调用 sleep() 调整父进程及各子进程的并发执行过程;
(3)认真查看和比较每次执行结果,分析原因。
实现的思想、方法和技术(含数据结构、算法):
使用系统调用 fork() 创建两个子进程 p1 和 p2,并且通 过 getpid() 输出其进程号 ,在子进程中输出各自的标识。 完成了进程的创建, 利用系 统调用 sleep()调整父进程及各子进程的并发执行过程体会了进程间的 并发特征。 本次实验比较简单,主要是运用 fork() 、getpid()、sleep() 这几个系统调用函数,没有涉及算法问题。
函数功能:
1. Fork()
(1) 功能:创建一子进程;
(2) 返回值
0 : 从进程返回;
>0 : 从父进程返回,返回值为子进程的进程标识号;
-1 : 创建失败返回。
主要代码:
#include<stdio.h>
#include<stdlib.h>
int main() {
int p1,p2;
while((p1=fork())==-1);
if(p1==0)
{
printf("brother1\n");
exit(0);
sleep(5);
}
else{
while((p2=fork())==-1);
if(p2==0)
{
printf("brother2\n");
exit(0);
sleep(0);
}
wait(0);
printf("father\n");
}
}
注释:
1.创建子进程 1
2.如果 p1 是 0,执行子进程 1 中的内容
3.否则将创建子进程 2
结果分析:
实验截图:
创建子进程 1;
如果 p1 是 0,执行子进程 1 中的内容;
否则将创建子进程 2
错误一:
忘加头文件 : #include<stdlib.h>
#include<wait.h> ;
错误二:
没见 wait(0),父进程没有等待子进程的创建,先上 CPU;
思考题:
(1)为什么各字符串的输出顺序会是任意的?
答:进程并发执行,子进程与父进程抢占处理机,所以输出字符顺序不同。
(2)改写程序,将字符串用循环语句一个一个字符输出,再查看执行结果如何?
答:当sleep ()语句不存在的时候,随机输出,在 brotherl输出的过程中,可能中途将brother2先输出再输出 brother1后边的字符,反之存在时顺序输出,当然顺序输出是建立在一个良好的控制的前提下的,否则也可能会乱序
实验心得:
(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)分析进程争用资源的现象,学习解决进程互斥的方法。
(4)复习课本关于进程控制和进程同步的内容,加深对进程管理概念的理解。
(5)认真阅读实验材料中进程管理部分,分析多个进程的运行情况。