Linux操作系统以其开源、稳定和高效的特点,广泛应用于各种服务器和嵌入式设备中,在银行系统中,Linux可以用于构建自动取款机(ATM)系统,实现自助服务功能,本文将详细介绍如何在Linux操作系统下实现一个简单的ATM系统,涵盖注册、登录、存款、取款、转账、修改密码、查询个人信息、显示所有账户信息及退出系统等核心功能。
二、系统架构与设计
1. 系统组件
客户端:用户交互界面,负责接收用户输入并显示操作结果。
服务器端:处理业务逻辑,包括用户认证、账户管理、交易处理等。
数据库:存储用户信息和交易记录。
2. 通信方式
使用多进程通信(如消息队列)在客户端和服务器端之间传递数据。
服务器端创建多个子进程,分别处理不同的业务请求。
3. 数据存储
使用文件系统存储用户信息和交易记录,每个用户一个文件。
文件名建议为用户账号,便于管理和查找。
三、核心功能实现
1. 开户
用户输入姓名、身份证号、设置密码。
服务器端验证信息的有效性后,创建一个以用户账号为名的文件,存储用户信息。
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