实验三---进程同步.doc
《实验三---进程同步.doc》由会员分享,可在线阅读,更多相关《实验三---进程同步.doc(7页珍藏版)》请在冰点文库上搜索。
![实验三---进程同步.doc](https://file1.bingdoc.com/fileroot1/2023-6/27/0ae5fdfa-fd1f-414f-9a77-9beede4976e9/0ae5fdfa-fd1f-414f-9a77-9beede4976e91.gif)
200X级XXXX专业集美大学诚毅学院2011~2012学年第一学期
集美大学
诚毅学院信息工程系
实验报告
课程名称
计算机操作系统
序号名称
实验三进程同步
姓名
孙幸杰
学号
2011957032
专业
计算1191
日期
13.11.22
成绩
教师
洪联系
评语:
1.实验目的:
掌握用Linux信号灯集机制实现两个进程间的同步问题
2.实验环境
Win7系统虚拟机下运行的Linux系统。
3.实验内容
司机与售票员问题是两个进程的同步问题,司机要启动汽车前,要检查售票员车门是否已经关好;
售票员要打开车门之前要等司机把车停稳.
要求:
需要的信号灯:
SystemV信号灯实现
用于控制司机是否可以启动车辆的的信号灯S1=0
用于控制售票员是否可以开门的信号灯S2=0
4.实验程序
(有详细注释)
//---------------------------------------------------
//这是一个公共汽车的驾驶员与售票员之间的同步问题
//一个进程模拟驾驶员,一个进程模拟售票员;
//驾驶员的动作:
启动车辆--驾驶车辆--到站停车
//售票员的动作:
关门--售票--开门;
//售票员把车门关好后,驾驶员才能启动汽车;
//当驾驶员在一个站把车子停稳后,售票员方能打开车门;
//
//本程序采用SystemV的信号灯集实现两者的同步
//2010.10.8
//-----------------------------------------------------
#include
#include
#include
#include
#include
#include
unionsemun{
intval;//仅用于SETVAL命令
structsemid_ds*buf;//用于IPC_SET等命令
ushort*array;//用于SETALL等命令
};
//用于信号灯初始化
//semid--信号灯的ID
//val--欲设置的信号灯初值
//sn--信号灯集的分量
voidseminit(intsemid,intval,intsn)
{
unionsemunarg;
arg.val=val;
semctl(semid,sn,SETVAL,arg);
};
//实现信号灯的P操作
//semid--信号灯的ID
//sn--信号灯集的分量
voidsemdown(intsemid,intsn)
{/*definePoperating*/
structsembufop;
op.sem_num=sn;
op.sem_op=-1;//P操作为-1
op.sem_flg=0;
semop(semid,&op,1);
}
//实现信号灯的V操作
//semid--信号灯的ID
//sn--信号灯集的分量
voidsemup(intsemid,intsn)
{/*defineVoperating*/
structsembufop;
op.sem_num=sn;
op.sem_op=1;//V操作为1
op.sem_flg=0;
semop(semid,&op,1);
}
main()
{
inti,j;
key_tsemkey;
char*pathname="./driver.c";
intsemid;
intrrand;
srand((int)time(0));//用于产生随机延时
semkey=ftok(pathname,45);
if(semkey==-1)
{
printf("Error:
createakeyerror!
\n");
exit(-1);
}
semid=semget(semkey,2,IPC_CREAT|0666);
if(semid==-1)
{
printf("Error:
createsemaphoreerror!
\n");
exit(-1);
}
seminit(semid,0,0);//对信号灯集的0号分量进行初始化
seminit(semid,0,1);//对信号灯集的1号分量进行初始化
if(fork()==0)//Createaprocess
{//子进程作为驾驶员进程
for(i=1;i<10;i++){
semdown(semid,0);//等待售票员关门
printf("Driver(pid:
%d):
Startthebus.\n",getpid());
printf("Driver(pid:
%d):
Traveling....\n",getpid());
rrand=1+(int)(6.0*rand()/(RAND_MAX+1.0));//产生一个(1-6)的随机数表示车辆的行驶时间
sleep(rrand);
printf("Driver(pid:
%d):
Arriveatastation.stop!
\n",getpid());
semup(semid,1);//唤醒售票员
}
}
else
{//父进程作为售票员进程
for(j=1;j<10;j++){
printf("Conductor(pid:
%d):
Closealldoors.\n",getpid());
semup(semid,0);//唤醒司机
printf("Conductor(pid:
%d):
Ticketing...\n",getpid());
semdown(semid,1);//等待汽车到站
printf("Conductor(pid:
%d):
Openalldoors.\n",getpid());
sleep
(1);
}
}
}
5.实验结果及其分析
输入程序:
程序:
编译:
运行结果:
6.实验小结
完成本实验后,我对基本的额进程间的通信有了初步的了解。