一.实验目的
1. 加深理解进程同步的概念及实现线程同步的原理。
2. 掌握Linux进程库支持的信号量同步机制和信号量互斥机制,学会通过信号量信号实现进程间的同步与互斥。
二.实验内容
实验4进程实现公交车司机与售票员同步
三.实验主要步骤
问题描述:
公共汽车上,司机和售票员的活动分别是:
司机的活动:启动车辆;正常行车;到站停车。
售票员的活动:关车门;售票;开车门。
在汽车不断的到站、停站、行驶过程中,用信号量和P,V操作实现它们的同步。
key1=ftok(“.”,36);
key2=ftok(“.”,98);
semid1=semget(key1,1,IPC_CREAT|IPC_EXCL|0666); //司机同步信号量
semid2=semget(key2,1,IPC_CREAT|IPC_EXCL|0666);//售票员同步信号量
问题解决:
我们可以使用两个信号量来实现司机与售票员间的同步,具体如下:
1.semctl函数进行初始化信号量为0 , v1.val=0; v2.val=0;
r1=semctl(semid1,0,SETVAL,v1);//v1参数是个semun共用体
2. semop函数进行PV设置;
3.实现司机与售票员进程同步PV操作
4.semctl函数进行删除信号量:
semctl(semid1,0,IPC_RMID);
semctl(semid2,0,IPC_RMID);
四、实验结果测试
1.本实验所涉及的部分关键代码如图1所示。

2.在Linux系统中,尝试使用ipcs
命令查看当前进程间通信的信息:通过观察【信号量数组】可以看到:当前有一个semid为1的信号量,权限为600(自己可读写,其余均不可以进行任何操作);此时将编译好的代码运行,控制台中输出了司机、乘客、售票员的动作,强制结束该程序后,再次使用ipcs
命令查看进程间通信情况,可以看到有两个新的信号量被创建,权限为666(在代码中进行了设置:所有人均可以读写),如图2所示。

分析与思考
◆如何删除进程信号?
答:使用命令ipcrm -s [进程信号ID]
即可删除相应的进程信号