#include "client.h"
int id_ask;
int id_reply;
int main()
{
int num;
id_ask = msgget(KEY_ASK,IPC_CREAT|0644);
id_reply = msgget(KEY_REPLY,IPC_CREAT|0644);
while(num = show())
{
if (num < 0 || num >6)
{
printf("非法输入请重新输入\n");
continue;
}
switch(num)
{
case 1:
open_kh();
break;
case 2:
destory();
break;
case 3:
save();
break;
case 4:
take();
break;
case 5:
trans_w();
break;
case 6:
look();
break;
}
}
return 0;
}
int show()
{
int num;
printf("请输入要办理的业务\n");
printf("—————1.开户—————\n");
printf("—————2.销户—————\n");
printf("—————3.存钱—————\n");
printf("—————4.取钱—————\n");
printf("—————5.转账—————\n");
printf("—————6.查询—————\n");
printf("—————0.退出—————\n");
scanf("%d",&num);
return num;
}
void open_kh(void)
{
struct TAG buf,rbuf;
memset(&buf,0,sizeof(buf));
memset(&rbuf,0,sizeof(rbuf));
buf.type = OPEN;
printf("输入姓名\n");
scanf("%s",buf.name);
printf("输入密码\n");
scanf("%s",buf.passwd);
printf("输入起始金额\n");
scanf("%f",&buf.money);
//向服务器发送开户请求
msgsnd(id_ask,&buf,sizeof(buf)-sizeof(long),0);
//接收服务器反馈开户结果
msgrcv(id_reply,&rbuf,sizeof(rbuf)-sizeof(long),OPEN,0);
if(strlen(rbuf.err) != 0)
printf("open err:%s",rbuf.err);
else
printf("新开账户:%d, 密码:%s ,余额:%.2f",rbuf.id,rbuf.passwd,rbuf.money);
}
void destory(void)//销户
{
struct TAG acc,racc;
memset(&acc,0,sizeof(acc));
memset(&racc,0,sizeof(racc));
acc.type = DESTROY;
printf("输入要销户的账号\n");
scanf("%d",&acc.id);
printf("输入要销户账号的密码\n");
scanf("%s",acc.passwd);
msgsnd(id_ask,&acc,sizeof(acc)-sizeof(long),0);
msgrcv(id_reply,&racc,sizeof(racc)-sizeof(long),DESTROY,0);
if(strlen(racc.err) == 0)
printf("销户成功\n");
else
{
printf("销户失败:%s\n",racc.err);
}
}
void look(void)//查询
{
struct TAG buf,rbuf;
memset(&buf,0,sizeof(buf));
memset(&rbuf,0,sizeof(rbuf));
buf.type = LOOK;
printf("输入要查询的账号\n");
scanf("%d",&buf.id);
printf("输入要查询账号的密码\n");
scanf("%s",buf.passwd);
msgsnd(id_ask,&buf,sizeof(buf)-sizeof(long),0);
msgrcv(id_reply,&rbuf,sizeof(rbuf)-sizeof(long),LOOK,0);
if(strlen(rbuf.err) == 0)
printf("余额为:%.2f\n",rbuf.money);
else
{
printf("查询失败:%s\n",rbuf.err);
}
}
void save(void)//存钱
{
struct TAG buf,rbuf;
memset(&buf,0,sizeof(buf));
memset(&rbuf,0,sizeof(rbuf));
buf.type = SAVE;
printf("输入存钱的账号\n");
scanf("%d",&buf.id);
printf("输入存钱账号的密码\n");
scanf("%s",buf.passwd);
printf("输入要存钱的金额\n");
scanf("%f",&buf.money);
msgsnd(id_ask,&buf,sizeof(buf)-sizeof(long),0);
msgrcv(id_reply,&rbuf,sizeof(rbuf)-sizeof(long),SAVE,0);
if(strlen(rbuf.err) == 0)
printf("存钱成功,余额为:%.2f\n",rbuf.money);
else
{
printf("存钱失败:%s\n",rbuf.err);
}
}
void take(void)//取钱
{
struct TAG buf,rbuf;
memset(&buf,0,sizeof(buf));
memset(&rbuf,0,sizeof(rbuf));
buf.type = TAKE;
printf("输入取钱的账号\n");
scanf("%d",&buf.id);
printf("输入取钱账号的密码\n");
scanf("%s",buf.passwd);
printf("输入要取钱的金额\n");
scanf("%f",&buf.money);
msgsnd(id_ask,&buf,sizeof(buf)-sizeof(long),0);
msgrcv(id_reply,&rbuf,sizeof(rbuf)-sizeof(long),TAKE,0);
if(strlen(rbuf.err) == 0)
printf("取钱成功,余额为:%.2f\n",rbuf.money);
else
{
printf("取钱失败:%s\n",rbuf.err);
}
}
void trans_w(void)//转账
{
struct TAG buf2,buf1,rbuf1,rbuf2;
memset(&buf1,0,sizeof(buf1));
memset(&buf2,0,sizeof(buf2));
memset(&rbuf1,0,sizeof(rbuf1));
memset(&rbuf2,0,sizeof(rbuf2));
buf1.type = TRANS;
buf2.type = TRANS;
printf("输入转出的账号\n");
scanf("%d",&buf1.id);
printf("输入转出账号的密码\n");
scanf("%s",buf1.passwd);
printf("输入要转出的金额\n");
scanf("%f",&buf1.money);
printf("输入转入的账号\n");
scanf("%d",&buf2.id);
msgsnd(id_ask,&buf1,sizeof(buf1)-sizeof(long),0);
msgrcv(id_reply,&rbuf1,sizeof(rbuf1)-sizeof(long),TRANS,0);
if(strlen(rbuf1.err) == 0)
{
printf("转出成功,余额为:%.2f\n",rbuf1.money);
msgsnd(id_ask,&buf2,sizeof(buf2)-sizeof(long),0);
msgrcv(id_reply,&rbuf2,sizeof(rbuf2)-sizeof(long),TRANS,0);
if(strlen(rbuf2.err) == 0)
{
printf("转入成功\n");
}
else
{
printf("转入失败:%s\n",rbuf2.err);
}
}
else
{
printf("转出失败:%s\n",rbuf1.err);
}
}
Linux系统编程阶段项目:基于消息队列的银行管理系统
需积分: 0 62 浏览量
更新于2023-05-05
收藏 8KB RAR 举报
在Linux系统编程中,银行管理系统的实现是一个典型的案例,它涉及到多进程间的通信与协作,这里我们主要关注的是基于消息队列的通信机制。消息队列是Linux内核提供的一种进程间通信(IPC, Inter-Process Communication)机制,允许进程间通过发送和接收消息进行数据交换。
我们需要理解Linux系统编程的基础。这包括熟悉C编程语言,因为大多数系统级编程都是用C语言完成的。你需要掌握基本的数据类型、控制结构、函数、指针等概念。同时,深入理解Linux操作系统的工作原理,如进程管理、内存管理、文件系统和I/O操作,这些都是编写银行管理系统所必需的。
在Linux环境下,银行管理系统可能包含多个进程,如前端用户界面进程、后台处理进程以及数据库管理进程等。这些进程需要高效地协同工作,消息队列便成为一种理想的通信手段。消息队列允许进程异步地发送和接收消息,具有消息缓存和一次性传递的特点,可以避免数据丢失并确保消息的有序性。
消息队列的使用需要调用特定的系统调用,如`msgget`用于创建或获取消息队列,`msgsnd`用于发送消息,`msgrcv`用于接收消息,而`msgctl`则用于对消息队列进行控制,如设置权限、删除消息队列等。在银行管理系统中,不同的进程可以通过消息队列发送交易请求、账户查询、转账指令等信息。
例如,当用户在前端发起一笔转账请求时,前端进程会将请求封装成一个消息,通过`msgsnd`发送到消息队列。后台处理进程通过`msgrcv`接收这个消息,解析请求,执行转账操作,并将结果返回给前端。这个过程保证了即使在高并发环境下,每个交易也能被正确处理,不会因为同步问题导致数据错误。
此外,为了实现更复杂的功能,如并发控制、事务处理、异常恢复等,你还需要了解线程编程、锁机制(如互斥锁、信号量)、文件锁定等概念。在银行系统中,数据的一致性和完整性至关重要,因此需要采用适当的同步机制来保证。
在实际项目开发中,除了底层的系统编程,你还需要关注软件工程的实践,比如代码管理、测试策略、文档编写等。对于银行管理系统,安全性是另一个重要方面,因此需要了解如何防止SQL注入、权限控制以及数据加密等安全措施。
基于消息队列的银行管理系统涉及到了Linux系统编程的多个层面,包括进程通信、多线程编程、数据库交互、同步机制以及安全性设计。通过这样的项目,你可以深入理解和应用这些知识,提高你的系统级编程能力。

ckidsdscsd
- 粉丝: 0
最新资源
- 科技平台如何借助AI+数智应用解决资源丰富度和可持续发展问题?.docx
- 科技平台如何借助AI+数智应用解决资源匮乏与服务低效的问题?.docx
- 科技平台如何借助AI+数智应用实现可持续发展,避免陷入“资源有余而活力不足”的困境?.docx
- 科技平台如何利用AI+数智应用工具提升服务价值和市场竞争力?.docx
- 科技平台如何通过AI+数智应用解决资源整合难题?.docx
- 科技平台运营模式创新有哪些AI+数智应用关键要素?.docx
- 科技市场化过程中,如何通过AI+数智应用有效整合资源以提升平台竞争力?.docx
- 科技市场化中,如何通过AI+数智应用应对技术转移过程中的挑战?.docx
- 科技项目创新管理中如何通过AI+数智应用高效整合多维度资源,解决平台资源匮乏问题?.docx
- 科技资源管理平台的三大核心问题是什么?如何通过AI+数智应用工具有效解决?.docx
- 科技资源管理平台如何通过AI+数智应用实现可持续发展?.docx
- 面对复杂的技术转移服务需求,如何通过AI+数智应用构建更智能高效的服务体系?.docx
- 面对技术引进合作分析的需求,AI+数智应用科技创新平台应如何高效应对?.docx
- 面对科技服务平台服务效能不足的问题,如何借助AI+数智应用科技创新助力提升服务专业性和效率?.docx
- 企业科技创新服务平台如何通过AI+数智应用保障服务质量与专业性?.docx
- 企业科技创新服务平台如何借助AI+数智应用解决科技资源匮乏与信息不对称问题?.docx