1、200X级XXXX专业 集美大学诚毅学院 20112012学年第一学期集 美 大 学诚毅学院信息工程系实 验 报 告课程名称计算机操作系统序号名称 实验三 进程同步姓名孙幸杰学号2011957032专业计算1191日期13.11.22成绩教师洪联系评语:1.实验目的:掌握用Linux信号灯集机制实现两个进程间的同步问题2实验环境Win7系统虚拟机下运行的Linux系统。3.实验内容司机与售票员问题是两个进程的同步问题,司机要启动汽车前,要检查售票员车门是否已经关好;售票员要打开车门之前要等司机把车停稳.要求:需要的信号灯: System V信号灯实现用于控制司机是否可以启动车辆的的信号灯 S1
2、=0用于控制售票员是否可以开门的信号灯 S2=04实验程序(有详细注释)/-/这是一个公共汽车的驾驶员与售票员之间的同步问题/一个进程模拟驾驶员,一个进程模拟售票员;/驾驶员的动作:启动车辆-驾驶车辆-到站停车/售票员的动作:关门-售票-开门;/售票员把车门关好后,驾驶员才能启动汽车;/当驾驶员在一个站把车子停稳后,售票员方能打开车门;/本程序采用System V的信号灯集实现两者的同步/ 2010.10.8/-#include #include #include #include #include #include union semun int val;/仅用于SETVAL命令 struc
3、t semid_ds *buf;/用于IPC_SET等命令 ushort *array;/用于SETALL等命令 ;/用于信号灯初始化/semid-信号灯的ID/val-欲设置的信号灯初值/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 sem
4、buf 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=./driv
5、er.c; int semid; int rrand; srand(int)time(0);/用于产生随机延时 semkey=ftok(pathname,45); if(semkey=-1) printf(Error:create a key error!n); exit(-1); semid=semget(semkey,2,IPC_CREAT | 0666); if(semid=-1) printf(Error:create semaphore error!n); exit(-1); seminit(semid,0,0);/对信号灯集的0号分量进行初始化 seminit(semid,0,1)
6、;/对信号灯集的1号分量进行初始化 if(fork()=0) /Create a process /子进程作为驾驶员进程 for(i=1;i10;i+) semdown(semid,0);/等待售票员关门 printf(Driver(pid:%d): Start the bus.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): Ar
7、rive at a station. stop!n,getpid(); semup(semid,1);/唤醒售票员 else /父进程作为售票员进程 for(j=1;j10;j+) printf(Conductor(pid:%d):Close all doors.n,getpid(); semup(semid,0);/唤醒司机 printf(Conductor(pid:%d):Ticketing.n,getpid(); semdown(semid,1); /等待汽车到站 printf(Conductor(pid:%d):Open all doors.n,getpid(); sleep(1); 5 实验结果及其分析输入程序:程序:编译:运行结果:6 实验小结完成本实验后,我对基本的额进程间的通信有了初步的了解。
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2