如何在Linux系统上使用ATM服务?

Linux ATM系统

atm on linux

Linux操作系统以其开源、稳定和高效的特点,广泛应用于各种服务器和嵌入式设备中,在银行系统中,Linux可以用于构建自动取款机(ATM)系统,实现自助服务功能,本文将详细介绍如何在Linux操作系统下实现一个简单的ATM系统,涵盖注册、登录、存款、取款、转账、修改密码、查询个人信息、显示所有账户信息及退出系统等核心功能。

二、系统架构与设计

1. 系统组件

客户端:用户交互界面,负责接收用户输入并显示操作结果。

服务器端:处理业务逻辑,包括用户认证、账户管理、交易处理等。

数据库:存储用户信息和交易记录。

2. 通信方式

使用多进程通信(如消息队列)在客户端和服务器端之间传递数据。

atm on linux

服务器端创建多个子进程,分别处理不同的业务请求。

3. 数据存储

使用文件系统存储用户信息和交易记录,每个用户一个文件。

文件名建议为用户账号,便于管理和查找。

三、核心功能实现

1. 开户

用户输入姓名、身份证号、设置密码。

服务器端验证信息的有效性后,创建一个以用户账号为名的文件,存储用户信息。

atm on linux

void cre_user() {
    account user;
    printf("输入你的ID:");
    scanf("%s", user.id);
    char filename[23];
    sprintf(filename, "%s.dat",user.id);
    int fd = open(filename, O_CREAT|O_RDWR, 0644);
    if (fd == -1) {
        perror("开户失败");
        exit(1);
    } else {
        printf("开户成功
");
    }
    close(fd);
}

2. 销户

用户输入账号、密码,服务器端验证后删除用户文件。

void dele_user() {
    char id[20];
    printf("请输入要删除的账号:");
    scanf("%s", id);
    char filename[23];
    sprintf(filename, "%s.dat", id);
    if (remove(filename) == 0) {
        printf("销户成功
");
    } else {
        perror("销户失败");
    }
}

3. 登录

用户输入账号、密码,服务器端验证通过后允许进行后续操作。

void denglu() {
    char id[20], pwd[20];
    printf("请输入账号:");
    scanf("%s", id);
    printf("请输入密码:");
    scanf("%s", pwd);
    char filename[23];
    sprintf(filename, "%s.dat", id);
    int fd = open(filename, O_RDONLY);
    if (fd != -1) {
        account temp;
        read(fd, &temp, sizeof(account));
        if (strcmp(temp.pwd, pwd) == 0) {
            printf("登录成功
");
            close(fd);
            // 进入主菜单或执行其他操作
        } else {
            printf("密码错误
");
        }
    } else {
        printf("账号不存在
");
    }
}

4. 存钱

用户输入存款金额,服务器端更新账户余额。

void depo_user() {
    char id[20];
    float money;
    printf("请输入账号:");
    scanf("%s", id);
    printf("请输入存款金额:");
    scanf("%f", &money);
    char filename[23];
    sprintf(filename, "%s.dat", id);
    int fd = open(filename, O_RDWR);
    if (fd != -1) {
        account temp;
        read(fd, &temp, sizeof(account));
        temp.money += money;
        lseek(fd, 0, SEEK_SET);
        write(fd, &temp, sizeof(account));
        printf("存款成功
");
        close(fd);
    } else {
        perror("存款失败");
    }
}

5. 取钱

用户输入取款金额,服务器端验证余额是否充足后进行扣款。

void fetc_user() {
    char id[20];
    float money;
    printf("请输入账号:");
    scanf("%s", id);
    printf("请输入取款金额:");
    scanf("%f", &money);
    char filename[23];
    sprintf(filename, "%s.dat", id);
    int fd = open(filename, O_RDWR);
    if (fd != -1) {
        account temp;
        read(fd, &temp, sizeof(account));
        if (temp.money >= money) {
            temp.money -= money;
            lseek(fd, 0, SEEK_SET);
            write(fd, &temp, sizeof(account));
            printf("取款成功
");
        } else {
            printf("余额不足
");
        }
        close(fd);
    } else {
        perror("取款失败");
    }
}

6. 转账

用户输入目标账号和转账金额,服务器端完成资金划转。

bool transfer_account(const string& block_name, const int number) {
    string tmp_block_name;
    cout << "please enter block_name:";
    cin >> tmp_block_name;
    string passwd;
    cout << "please enter passwd:";
    cin >> passwd;
    vector<struct user>::iterator tmp = Find(tmp_block_name, passwd);
    if (tmp != vector_user.end()) {
        if (tmp->_total_money < number) {
            cout << "余额不足" << endl;
            return false;
        }
        vector<struct user>::iterator it = Find(block_name);
        pthread_mutex_lock(&mutex_lock); //加锁
        tmp->_total_money -= number;
        it->_total_money += number;
        pthread_mutex_unlock(&mutex_lock); //解锁
        return true;
    }
    return false;
}

7. 修改密码

用户输入原密码和新密码,服务器端验证后更新密码。

void change_password() {
    char id[20], oldpwd[20], newpwd[20];
    printf("请输入账号:");
    scanf("%s", id);
    printf("请输入原密码:");
    scanf("%s", oldpwd);
    printf("请输入新密码:");
    scanf("%s", newpwd);
    char filename[23];
    sprintf(filename, "%s.dat", id);
    int fd = open(filename, O_RDWR);
    if (fd != -1) {
        account temp;
        read(fd, &temp, sizeof(account));
        if (strcmp(temp.pwd, oldpwd) == 0) {
            strcpy(temp.pwd, newpwd);
            lseek(fd, 0, SEEK_SET);
            write(fd, &temp, sizeof(account));
            printf("修改密码成功
");
        } else {
            printf("原密码错误
");
        }
        close(fd);
    } else {
        perror("修改密码失败");
    }
}

8. 查询个人信息和所有账户信息

用户可以选择查询自己的账户信息或所有账户信息。

void find_user() {
    char id[20];
    printf("请输入要查询的账号:");
    scanf("%s", id);
    char filename[23];
    sprintf(filename, "%s.dat", id);
    int fd = open(filename, O_RDONLY);
    if (fd != -1) {
        account temp;
        read(fd, &temp, sizeof(account));
        printf("账号: %s
姓名: %s
余额: %.2f
", temp.id, temp.name, temp.money);
        close(fd);
    } else {
        perror("查询失败");
    }
}

以上就是关于“atm on linux”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/645363.html

Like (0)
Donate 微信扫一扫 微信扫一扫
K-seo的头像K-seoSEO优化员
Previous 2024-11-16 01:46
Next 2024-11-16 01:48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

免备案 高防CDN 无视CC/DDOS攻击 限时秒杀,10元即可体验  (专业解决各类攻击)>>点击进入