linux内核分析项目设计

项目内容:
实现一个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 // 标志串:结束一个预订代理请求序列 
……

⚫ 程序输出:针对输入的各交易的执行情况以及最后每个航班座位的分配信息(包含
预订/销售对应的乘客姓名)。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/722255
  • 以下回答由chatgpt基于相关博客总结生成:

    问题优化描述

    问题标题:设计Linux内核分析项目,模拟多进程并发的预订代理系统

    问题内容: 我正在设计一个Linux下的项目,旨在模拟多个预订代理连接到实时航空公司的中央计算机进行工作。以下是项目的具体要求:

    1. 每个预订代理都会通过一个进程来表示,代理的输入会包含代理进行的所有预订、售票和取消预订/售票操作。
    2. 多个预订代理可能同时执行相同的交易,因此需要以原子方式(互斥)实现这些操作。
    3. 如果预订代理尝试预订或销售已售出的座位,则程序应拒绝该请求并打印"座位已售出"的信息;如果交易涉及不存在的航班,则系统也应打印错误信息。
    4. 为了正确实现并发操作,需要使用Linux信号量来控制对航班相关信息的访问,每个航班应有至少一个信号量进行控制;航班的信息数据库应使用共享存储区来存储。
    5. 合法的交易请求包括:
    6. 预订: reserve 航班号 座位号 乘客姓名
    7. 售票: ticket 航班号 座位号 乘客姓名
    8. 取消预订/销售: cancel 航班号 座位号 乘客姓名
    9. 可以在售票之前不需要先预订,但只有预订或销售过的座位才能取消。
    10. 座位编号由一位或两位数字开头,后跟一个字母。数字代表行号,字母代表行内的座位序号。例如:1A 表示第1行的第1个座位,1B 表示第1行的第2个座位,依此类推。
    11. 预订的乘客姓名不能包含空格。
    12. 为了模拟航空公司的中央计算机和预订代理的计算机终端之间的传输延迟以及每个交易的处理时间,每个预订代理的描述应包括四行,指定该代理执行的四个操作中每个操作所需的总执行时间(以秒为单位)。在程序中,这些指定的时间将对应于交易的临界区部分的长度。可以通过在相应操作的临界区中调用睡眠函数(sleep)来实现。
    13. 程序的输入将是一个文本文件,具体格式如下: [操作1持续时间] [操作2持续时间] [操作3持续时间] [操作4持续时间] [交易1] [交易2] ...

    详细解决方案

    为了更好地理解并回答以上问题,需要根据要求逐步设计并实现一个多进程并发的预订代理系统,这里提供一个概括性的解决方案:

    1. 使用C/C++语言编写程序:
    2. 使用C/C++编写程序用于模拟预订代理系统的功能和操作。
    3. 使用系统调用或库函数来实现对座位、航班和代理的管理和操作。

    4. 使用进程来表示每个预订代理:

    5. 每个预订代理对应一个独立的进程,该进程负责处理代理的输入和执行相应的操作。
    6. 使用进程间通信机制(如共享内存、信号量等)来实现代理之间的互斥和同步。

    7. 实现原子方式(互斥)的操作:

    8. 使用Linux信号量来控制对航班相关信息的访问,以实现对操作的互斥执行。
    9. 为每个航班创建至少一个信号量,限制对航班信息的并发访问。

    10. 处理操作请求的合法性:

    11. 在代理处理请求之前,对请求进行验证,包括座位状态的合法性和航班的存在性。
    12. 如果座位已售出或航班不存在,拒绝该请求并打印相应的错误信息。

    13. 设计合法的交易请求格式:

    14. 预订操作:reserve 航班号 座位号 乘客姓名
    15. 售票操作:ticket 航班号 座位号 乘客姓名
    16. 取消预订/销售操作:cancel 航班号 座位号 乘客姓名

    17. 建立座位编号规则:

    18. 座位编号由一位或两位数字开头,后跟一个字母,用于表示座位的行号和序号。

    19. 实现预订和销售操作的先决条件:

    20. 可以在售票之前不需要先预订,但只有预订或销售过的座位才能取消。
    21. 在执行取消操作前,需要先进行预订或销售操作。

    22. 为模拟传输延迟和处理时间,使用睡眠函数(sleep):

    23. 在每个操作的临界区中调用睡眠函数来模拟航空公司的中央计算机和预订代理的计算机终端之间的传输延迟以及每个交易的处理时间。

    24. 输入的文件格式和处理:

    25. 程序的输入是一个文本文件,按照一定的格式指定操作的持续时间和交易请求,需要实现相应的输入文件解析功能。

    以上是一个概括性的解决方案,具体实现时需要根据具体需求和代码结构进行优化和具体实现。

不知道这个是否满足你的要求,以下是一个实现航空预订代理的简单示例程序:

#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