项目内容:
实现一个Linux下的多进程并发程序以模拟连接到实时航空公司中央计算机的几个航空
公司预订代理的工作。
具体要求:
⚫ 每个预订代理用一个进程表示,该进程的输入涵盖了该代理进行的所有预订/售票
等操作。预订代理可以进行预订、售票和取消预订/售票。
⚫ 两个或多个预订代理可能同时执行同样的交易,因此必要时应该按原子方式(互斥
地)实现上述这些操作。
⚫ 如果预订代理企图预订或销售已售出的座位,则程序应拒绝该请求并打印“座位已
售出”信息;如果交易涉及不存在的航班,则系统也应打印错误信息。
⚫ 为正确实现上述并发操作,须使用 Linux 信号量对航班相关信息的存取进行控制,
每个航班至少应该有一个信号量进行控制;航班的信息数据库应使用共享存储区来
存放。
⚫ 合法的交易请求有:
◼ reserve 航班号 座位号 乘客姓名
◼ ticket 航班号 座位号 乘客姓名
◼ cancel 航班号 座位号 乘客姓名
◼ check_passenger 乘客姓名 // 显示该乘客预订或购买的座位
⚫ 售票前无需先预订,但只有预订或销售过才能取消。
⚫ 座位编号由一位或两位数字开头,其后跟随一个字母。数字代表行号,字母代表行
内的座位序,例如:1A 表示第 1 行的第 1 个座位,1B 表示第 1 行第 2 个座位等。
⚫ 预约姓名不能包含空格。
⚫ 为了模拟航空公司的中央计算机和预订代理的计算机终端之间的传输延迟以及每
个交易的处理时间,每个预订代理描述的前四行应指定该预订代理执行的四个操作
中的每一个的所需总执行时间(以秒为单位)。在程序中,这些指定的时间就是对
应交易的临界区部分的长度。实现时可通过在相应操作临界区中调用 sleep 加以实
现。
⚫ 程序的输入是一个文本文件,模板如下:
begin flights // 标志串:开始有效航班清单
航班号 座位行数 每行的座位数
航班号 座位行数 每行的座位数
…
end flights // 标志串:结束有效航班清单
begin agent // 标志串:开始一个预订代理请求序列
reserve 预订时间 // 秒数
ticket 售票时间 // 秒数
cancel 取消时间 // 秒数
check_passenger 查询时间 // 秒数
…… // 合法的请求序列
end agent // 标志串:结束一个预订代理请求序列
begin agent // 标志串:开始一个预订代理请求序列
reserve 预订时间 // 秒数
ticket 售票时间 // 秒数
cancel 取消时间 // 秒数
check_passenger 查询时间 // 秒数
…… // 合法的请求序列
end agent // 标志串:结束一个预订代理请求序列
……
⚫ 程序输出:针对输入的各交易的执行情况以及最后每个航班座位的分配信息(包含
预订/销售对应的乘客姓名)。
问题标题:设计Linux内核分析项目,模拟多进程并发的预订代理系统
问题内容: 我正在设计一个Linux下的项目,旨在模拟多个预订代理连接到实时航空公司的中央计算机进行工作。以下是项目的具体要求:
[操作1持续时间] [操作2持续时间] [操作3持续时间] [操作4持续时间] [交易1] [交易2] ...
为了更好地理解并回答以上问题,需要根据要求逐步设计并实现一个多进程并发的预订代理系统,这里提供一个概括性的解决方案:
使用系统调用或库函数来实现对座位、航班和代理的管理和操作。
使用进程来表示每个预订代理:
使用进程间通信机制(如共享内存、信号量等)来实现代理之间的互斥和同步。
实现原子方式(互斥)的操作:
为每个航班创建至少一个信号量,限制对航班信息的并发访问。
处理操作请求的合法性:
如果座位已售出或航班不存在,拒绝该请求并打印相应的错误信息。
设计合法的交易请求格式:
reserve 航班号 座位号 乘客姓名
ticket 航班号 座位号 乘客姓名
取消预订/销售操作:cancel 航班号 座位号 乘客姓名
建立座位编号规则:
座位编号由一位或两位数字开头,后跟一个字母,用于表示座位的行号和序号。
实现预订和销售操作的先决条件:
在执行取消操作前,需要先进行预订或销售操作。
为模拟传输延迟和处理时间,使用睡眠函数(sleep):
在每个操作的临界区中调用睡眠函数来模拟航空公司的中央计算机和预订代理的计算机终端之间的传输延迟以及每个交易的处理时间。
输入的文件格式和处理:
以上是一个概括性的解决方案,具体实现时需要根据具体需求和代码结构进行优化和具体实现。
不知道这个是否满足你的要求,以下是一个实现航空预订代理的简单示例程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.QtCore.h>
#define FLIGHT_INFO_FILE "flight_info.txt"
#define BOARDING_PASSENGL_FILE "boarding_passengers.txt"
#define CRITICAL_SECTOR_SIZE 10 // 临界区大小
int main() {
int process_id, action, flight_id, seat_id, passenger_name[20], seat_taken = 0;
FILE *flight_info, *boarding_passengers;
char *line = NULL;
size_t len = 0;
ssize_t read = 0;
struct semid_ds sem;
int sem_id;
// 打开航班信息和已预订/售票的乘客信息文件
flight_info = fopen(FLIGHT_INFO_FILE, "r");
boarding_passengers = fopen(BOARDING_PASSENGL_FILE, "w");
// 创建信号量
sem_id = semget(" Sem_", 1, 0666, IPC_CREATE);
if (sem_id == -1) {
perror("semget");
exit(EXIT_FAILURE);
}
// 进入临界区,进行预订代理操作
while (1) {
printf("Please enter the process ID(1-3): ");
scanf("%d", &process_id);
getchar(); // 读取换行符
printf("Please enter the action(1-4): ");
scanf("%d", &action);
getchar(); // 读取换行符
switch (action) {
case 1: // 预柱
case 2: // 出票
case 3: // 取消预柱
case 4: // 检查乘客信息显示其预柱/出票情况。
default: break; // 不合法的操作请求。
} // switch语句块结束标记,以下为不同操作的实现代码。注意:每个操作都需要按原子方式执行,互斥地访问共享的航班信息和已预订/售票的乘客信息。共享的航班信息和已预订/售票的乘客信息都存储在同一个文件中,每个预订代理都有自己的文件指针,可以按需读取和写入。
switch (action) {
case 1: // 预柱操作实现代码。需要先检查航班座位是否已被预订或售出,然后将该座位标记为已预订,如果航班信息文件中的座位信息与已预订/售票的乘客信息文件中的乘客信息匹配成功,则说明预柱成功,否则预柱失败。
#未完待续,如有帮助,恭请采纳
参考一下:
Linux多进程并发编程教程:https://www.bogotobogo.com/cplusplus/multithreading_ipc.php