• 2025年8月19日 星期二

H30521-实验四-进程同步

5 月 12, 2023

一.实验目的

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所示。

图1

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

图2

分析与思考

◆如何删除进程信号?

答:使用命令ipcrm -s [进程信号ID]即可删除相应的进程信号

附件下载

Avatar photo

李星海

简介: 2025-今 浙江农林大学 | 2022-今 广州白蓝碗蛋科技有限公司 | 2022-2024 广州商学院 | 2019-2022 广东工贸职业技术学院 | 服务宗旨:心始至客,行亦致远。