集 美 大 学 诚毅学院信息工程系
实 验 报 告
课程名称 序号名称
计算机操作系统
实验三 进程同步
姓名 专业 成绩
评语: 孙幸杰 计算1191
学号 日期 教师
2011957032
13.11.22 洪联系
200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期
1.实验目的:
掌握用Linux信号灯集机制实现两个进程间的同步问题 2.实验环境
Win7系统虚拟机下运行的Linux系统。 3.实验内容
司机与售票员问题是两个进程的同步问题,司机要启动汽车前,要检查售票员车门是否已经关好;
售票员要打开车门之前要等司机把车停稳. 要求:需要的信号灯: System V信号灯实现
用于控制司机是否可以启动车辆的的信号灯 S1=0 用于控制售票员是否可以开门的信号灯 S2=0 4.实验程序 (有详细注释)
//--------------------------------------------------- //这是一个公共汽车的驾驶员与售票员之间的同步问题 //一个进程模拟驾驶员,一个进程模拟售票员; //驾驶员的动作:启动车辆--驾驶车辆--到站停车 //售票员的动作:关门--售票--开门;
//售票员把车门关好后,驾驶员才能启动汽车;
//当驾驶员在一个站把车子停稳后,售票员方能打开车门; //
//本程序采用System V的信号灯集实现两者的同步 // 2010.10.8
//-----------------------------------------------------
#include
union semun{
int val;//仅用于SETVAL命令
struct semid_ds *buf;//用于IPC_SET等命令 ushort *array;//用于SETALL等命令 };
//用于信号灯初始化 //semid--信号灯的ID
//val--欲设置的信号灯初值
200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期
//sn--信号灯集的分量
void seminit(int semid,int val,int sn) {
union semun arg; arg.val=val;
semctl(semid,sn,SETVAL,arg); };
//实现信号灯的P操作 //semid--信号灯的ID //sn--信号灯集的分量
void semdown(int semid,int sn) {/* define P operating*/ struct sembuf op; op.sem_num=sn;
op.sem_op=-1;//P操作为-1 op.sem_flg=0;
semop(semid,&op,1); }
//实现信号灯的V操作 //semid--信号灯的ID // sn--信号灯集的分量
void semup(int semid, int sn) {/*define V operating*/ struct sembuf op; op.sem_num=sn;
op.sem_op=1;//V操作为1 op.sem_flg=0;
semop(semid,&op,1); }
main() {
int i,j;
key_t semkey;
char *pathname=\ int semid; int rrand;
srand((int)time(0));//用于产生随机延时 semkey=ftok(pathname,45); if(semkey==-1)
200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期
{
printf(\ exit(-1); }
semid=semget(semkey,2,IPC_CREAT | 0666); if(semid==-1) {
printf(\ exit(-1); }
seminit(semid,0,0);//对信号灯集的0号分量进行初始化 seminit(semid,0,1);//对信号灯集的1号分量进行初始化 if(fork()==0) //Create a process {//子进程作为驾驶员进程 for(i=1;i<10;i++){
semdown(semid,0);//等待售票员关门
printf(\ printf(\
rrand=1+(int)(6.0*rand()/(RAND_MAX+1.0));//产生一个(1-6)的随机数表示车辆的行驶时间 sleep(rrand);
printf(\Arrive at a station. stop!\\n\ semup(semid,1);//唤醒售票员 } } else
{//父进程作为售票员进程 for(j=1;j<10;j++){
printf(\ semup(semid,0);//唤醒司机
printf(\ semdown(semid,1); //等待汽车到站
printf(\ sleep(1); } } }
5. 实验结果及其分析 输入程序:
程序:
200X级XXXX专业 集美大学诚毅学院 2011~2012学年第一学期