实验三---进程同步.doc

上传人:b**** 文档编号:14762182 上传时间:2023-06-27 格式:DOC 页数:7 大小:420.54KB
下载 相关 举报
实验三---进程同步.doc_第1页
第1页 / 共7页
实验三---进程同步.doc_第2页
第2页 / 共7页
实验三---进程同步.doc_第3页
第3页 / 共7页
实验三---进程同步.doc_第4页
第4页 / 共7页
实验三---进程同步.doc_第5页
第5页 / 共7页
实验三---进程同步.doc_第6页
第6页 / 共7页
实验三---进程同步.doc_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

实验三---进程同步.doc

《实验三---进程同步.doc》由会员分享,可在线阅读,更多相关《实验三---进程同步.doc(7页珍藏版)》请在冰点文库上搜索。

实验三---进程同步.doc

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.实验小结

完成本实验后,我对基本的额进程间的通信有了初步的了解。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2