自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(50)
  • 收藏
  • 关注

原创 MPRPC项目(第11天,zookeeper)

解压完后,1、进入conf目录2、将zoo_sample.cfg改为zoo.cfg3、进入zoo.cfg4、将dataDir修改一个路径,因为/tmp是临时文件5、再进入bin目录,执行./zkServer.sh start就成功了。

2026-01-08 00:05:50 318

原创 MPRPC项目(第十天,日志功能实现)

在本项目中,日志有以下功能1、异步写入:使用独立线程写日志,不影响主业务逻辑性能2、分级日志:区分INFO和ERROR级别,便于过滤和处理3、按日期分文件:每天生成独立的日志文件,便于管理和查找4、维护系统稳定性和排查问题多个线程指需要使用日志记录的线程,

2026-01-05 21:38:18 164

原创 MPRPC项目(第九天,新增服务以及controller实现)

两个都与用户登录没有什么区别。

2025-12-31 00:15:21 191

原创 MPRPC项目(第八天,(消费者视角)RpcChannel的调用过程以及实现)

这里实现的就是左边黑圈里的过程:开始调用->序列化->发送->接收响应结果->反序列化右边的_stub是专门给rpc服务调用者来使用的,想要调用rpc服务,也应该用在user.proto定义好的。

2025-12-24 00:04:41 504

原创 MPRPC项目(第七天,rpcprovider分发rpc服务)

这里使用到的是OnMessage函数,在rpcprovider.h的rpcprovider类下。

2025-12-16 00:56:36 379

原创 MPRPC项目(第六天,RpcProvider发布方法)

今天学的时候突然发现理解的很浅显,厚礼蟹。到目前为止所做的只有用户服务相关的功能,所以叫UserRervice,然后这个用户服务下目前有登录功能。

2025-12-04 01:07:23 240

原创 MPRPC项目制作(第五天,开发RpcProvider的网络服务)

EventLoop是多路I/O复用(epoll,epoll_wait)的高级封装,以及其他功能OnMessage负责读写事件处理OnConnection是accept触发返回新的socket之后或者主动/异常断开连接之后执行(在EventLoop线程中执行,需要处理资源管理和异常情况)

2025-12-02 15:03:09 261

原创 MPRPC项目制作(第四天)

先花了很长的的时间解决了build(具体描述找不到了)和mprpcapplication.cc找不到头文件的问题,可以这样解决build下的问题这样重新配置了按打开命令面板;输入并执行(插件会自动删除旧缓存 + 重新配置)有的时候可以等vscode缓冲过来或者清除一下缓存。有的时候也可以进入build目录,手动cmake:先rm -r *,然后cmake..,再make一下。

2025-11-30 21:44:23 246

原创 MPRPC项目制作(第三天)

这里的UserServiceRpc是在fixbug命名空间(类似于using namespace)中命名的,所以这里也要加fixbug。2、user.proto文件。

2025-11-29 00:42:12 412

原创 MPRPC项目制作(第二天)

/声明protobuf的版本//声明代码所在包(对于c++来说就是namespace)//登录消息类型 name pwd//定义登录响应消息类型enum Sex{man = 0;woman = 1;Sex sex =3;//定义列表类型。

2025-11-28 17:20:26 191

原创 分布式网络通信框架-rpc通信原理(项目制作第一天)

1、受限于硬件资源,聊天服务器所能承受的用户的并发量。2、任意模块修改,都会导致整个项目代码重新编译、部署。(提出有关makefile疑问)把编译项目想象成 “做一桌子菜”,Makefile 是 “聪明的厨师”,原本它的逻辑是:“哪个菜的食材(模块代码)变了,就只重做这个菜”。但如果出现这两种情况,就会变成 “改一个菜的食材,却要重做整桌菜”:第一种情况:菜和菜之间绑得很死(比如 “番茄炒蛋” 和 “西红柿汤” 共享同一个番茄,改了番茄,两个菜都得重做,且必须一起上桌)。

2025-11-26 23:37:48 596

原创 郁闷,无语[特殊字符]

给ubuntu扩个硬盘给我搞得进不去了。文件也不知道被格式化没有。我的学习成果૮₍ɵ̷﹏ɵ̷̥̥᷅₎ა。

2025-11-26 01:47:59 302

原创 epoll和poll在并发上的核心区别(浅显理解)

poll每次都要将要监听的struct pollfd数组全都拷贝给内核,而epoll是通过epoll_ctl来一个注册进内核一个,然后内核会记住。epoll下内核找到该fd的时间是o(1),poll是o(n).

2025-11-06 22:12:32 93

原创 linux学习第31天(条件变量)

线程同步:协同步调,对公共区域数据按序访问。防止数据混乱,产生与时间有关的错误。锁的使用:建议锁!对公共数据进行保护。所有线程【应该】在访问公共数据前先拿锁再访问。但,锁本身不具备强制性。使用mutex(互斥量、互斥锁)一般步骤:pthread_mutex_t 类型。创建锁初始化 1加锁 1-- --> 04. 访问共享数据(stdout)解锁 0++ --> 1销毁锁初始化互斥量:动态初始化。静态初始化。注意事项:尽量保证锁的粒度, 越小越好。

2025-07-13 22:39:21 889

原创 linux学习第30天(线程同步和锁)

协同步调,对公共区域数据按序访问。防止数据混乱,产生与时间有关的错误。数据混乱的原因资源共享(独享资源则不会)调度随机(意味着数据访问会出现竞争)线程间缺乏必要同步机制。

2025-07-12 21:09:05 1332

原创 linux学习第29天(线程)

进程:最小分配资源单位,可看成只有一个线程的进程。有独立的 进程地址空间。有独立的pcb。线程:最小 的执行单位。有独立的pcb,没有独立的进程地址空间。可以用ps -Lf 进程id进行查看,这是打开firefox的进程和线程LWP:light weight process 轻量级的进程,本质仍是进程(在Linux环境下)

2025-07-09 18:25:05 492

原创 linux学习第28天(进程组、会话)

当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID==第一个进程ID(组长进程)。所以,组长进程标识:其进程组ID==其进程ID。组长进程可以创建一个进程组,创建该进程组中的进程,然后终止。只要进程组中有一个进程存在,进程组就存在,与组长进程是否终止无关。

2025-07-03 14:46:48 949

原创 linux学习第27天(信号捕捉特性、内核实现信号捕捉过程、借助信号捕捉回收子进程)

进程正常运行时,默认PCB中有一个信号屏蔽字,假定为☆,它决定了进程自动屏蔽哪些信号。当注册了某个信号捕捉函数,捕捉到该信号以后,要调用该函数。而该函数有可能执行很长时间,在这期间所屏蔽的信号不由☆来指定。而是用sa_mask来指定。调用完信号处理函数,再恢复为☆。XXX信号捕捉函数执行期间,XXX信号自动被屏蔽。阻塞的常规信号不支持排队,产生多次只记录一次。(后32个实时信号支持排队)

2025-07-01 17:08:11 457

原创 linux学习第26天(信号集)

信号集就是一个整数,这整数32位你自己设置,设置好了和系统的mask进行位操作sigset_t set:自定义信号集sigemptyset(sigset_t *set):清空信号集sigfillset(sigset_t *set):全部置1sigaddset(sigset_t *set,int signum):将一个信号添加到集合中sigdelset(sigset_t *set,int signum):将一个信息集合中移除。

2025-06-28 17:11:25 612

原创 linux学习第25天(信号,kill函数和指令,alarm函数,setutimer函数)

简单、不能携带大量信息、满足某种条件才能发送。

2025-06-27 15:42:10 1105

原创 linux学习第24天(mmap建立父子间通信、无血缘关系进程间通信、匿名映射)

前面是写,后面是读一个读,一个写。

2025-06-17 16:00:19 483

原创 linux学习第23天(mmap函数、注意事项)

头文件:sys/mman.h参数:addr:指定映射区的首地址,通常串NULL,表示让系统自动分配length:共享映射区的大小(<=文件的实际大小)prot:共享内存映射区的读写属性。fiags:标注共享内存的共享属性。fd:用于创建共享内存映射区的那个文件的文件描述符offset:默认0(表示映射文件全部)。偏移位置。需是4k的整数倍返回值:成功:返回映射区的首地址。失败:MAP_FAILED,设置errno创建一个共享内存映射区。

2025-06-17 14:37:42 704

原创 linux学习第22天(fifo实现非血缘关系进程间通信\文件用于进程间通信)

左边写端,右边读端,可以多个写端一个读端,也可以一个写端多个读端,但是只有一个能读到,然后回收这是多个写端一个读端。

2025-06-16 14:56:50 170

原创 linux学习第21天(兄弟进程通信、多个读写端操作管道和管道缓冲区大小)

下面是两个写端,一个读端父进程必须等一下,不然可能俩子进程只写了一个,父进程就读完跑路了。

2025-06-12 23:47:51 273

原创 linux学习第20天(进程间通信,管道)

进程间通信的常用方式、特征:管道:简单信号:开销小mmap映射:非血缘关系进程间socket(本地套接字):稳定、、、、、、

2025-06-11 19:30:43 302

原创 linux学习第19、20天(父子进程)

ps ajx -->查看pid,ppid,gid,sid。

2025-06-03 17:22:17 1035

原创 linux学习第18天(fork函数)

pid_t fork(void):创建一个子进程成功:父进程返回子进程pid子进程返回0(创建成功)失败:-1。

2025-06-02 14:50:23 272

原创 linux学习第17天(进程和程序以及cpu相关,pcb进程控制块)

程序:死的,只占用磁盘空间 --剧本进程:活的,运行起来的程序,占用内存,cpu等资源 --戏。

2025-05-29 20:30:03 454

原创 linux学习第16天(fcntl实现dup)

未被占用,就=该值的文件描述符。参数3:被占用的,返回最小可用的文件描述符。因为0,1,2,3都被占用,所以为4。修改一下,加上这一段代码。

2025-05-26 09:46:09 276

原创 linux学习第15天(dup和dup2)

头文件#include<unistd.h>用来做重定向,本质就是复制文件描述符。

2025-05-25 21:24:18 539

原创 linux学习第15天(递归遍历目录实现-ls -R)

1.判断命令参数,获取用户要查询的目录名。argv[1]2.判断用户指定的是否为目录。-->封装函数isFile3.读目录:opendir()做出判断普通文件:直接打印目录:拼接目录访问绝对路径。递归调用自己closedir()

2025-05-25 20:05:45 463

原创 linux学习第14天(文件目录rwx权限差异,目录操作函数)

没有r权限,可以进入目录但是不能看目录的内容没有x权限,不能进入目录。

2025-05-24 20:37:02 222

原创 linux学习第14天(文件存储,link和Unlink,隐式回收)

dentry:目录项,增加硬链接都是增加目录项当inode为0时,在磁盘上不会被删除,只有下一个文件来覆盖当前文件才会真正意义上的删除。

2025-05-24 19:59:51 1050

原创 linux学习第13天(fcntl函数,lseek函数)

改变一个已经打开的文件的访问控制属性fcntl:fd 文件描述符cmd 命令,决定了后续参数个数、、、获取文件状态:F_GETFL设置文件状态:F_SETFL。

2025-05-23 14:42:47 592

原创 linux学习第12天(阻塞和非阻塞)

1:并且errno = EAGAIN或者EWOULDBLOCK,说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。open(“/dev/tty”,O_RDWR|O_NOBLOCK) --设置/dev/tty非阻塞状态,(默认为阻塞状态)读取终端,询问5次,没有输入就时间耗尽,退出程序,有就再打印出来。产生阻塞的场景:读设备文件,读网络文件(读常规文件无阻塞概念)阻塞和非阻塞:是设备文件,网络文件的属性。/dev/tty--终端文件。

2025-05-20 17:04:37 605

原创 linux学习第11天(open函数,read函数,write函数)

1:erron = EAGIN或者EWOULDBLOCK,说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。flags 权限控制,只读,只写,读写。read那边的缓冲区一次拷贝1024个字符,(如果拷贝较少的话)会大量进行内核态和用户态的切换,所以非常耗时。fgetc/fputc有个缓冲区,4096,所以它并不是一个字节一个字节地写,内核和用户切换就比较少。fd:文件描述符(-1,3等)fd:文件描述符(-1,3等)buf:存数据的缓冲区。

2025-05-19 20:45:47 1046

原创 linux学习第十天(makefile)

1个规则:1个规则:目标:依赖条件(一个tab缩进)命令1.目标的时间必须晚于依赖条件的时间,否则,更新目录2.依赖条件如果不存在,找寻新的规则去产生依赖ALL:指定makefile的终极目标2个函数:src = $(wildcard ./*.c):匹配当前目录下所有.c文件,将文件名组成列表,赋值给src。obj = $(patsubst %.c,%.o, $(src)):将参数3中,包含参数1(.c)的部分,替换为参数2。obj = add.o sub.o div1.o(.o是后缀)

2025-05-11 22:27:51 875

原创 linux学习第八天(静态库,动态库)

静态库在文件中静态展开,所以有多少文件就展开多少次,非常吃内存,100M展开100次,就是1G,但是这样的好处就是静态加载的速度快动态库会将动态库加载到内存,10个文件也只需要加载一次,然后这些文件用到库的时候临时去加载,速度慢一些,但是很省内存动态库和静态库各有优劣,根据实际情况合理选用即可。

2025-05-08 14:54:28 611

原创 linux学习第七天(gcc)

gcc -I ./文件夹 hello.c -s -o hello或者gcc hello.c -o a.out -I 路径。当头文件和源码不在同一级目录下,需要指定头文件,否则会编译失败,这就需要指定头文件。-Wall:显示所有警告信息用于gdb调试下面例子,比如定义变量未使用。gcc编译:gcc -S hello.c -o hello.s。-c:只做预处理,编译,汇编。-D:向程序中“动态”注册宏定义。-I:指定头文件所在目录位置。-g:编译时添加调试文件,-l:指定动态库库名。-L:指定动态库路径。

2025-05-06 17:05:50 482

原创 linux学习第七天(vim)

一段删除:光标选中要删除的首字符,按v进入可视模式,再使用hjkl移动到要删除的末尾,按d删除。区域替换::24,35s /待替换词/替换词/g 替换24-35行之间的目标词。先按“/”,再输入与搜索关键字,回车,继续输入n就继续检索下一个,输入N跳到上一个。全篇替换:%s /替换词/目标词(只能替换每一行的首个)可以加上/g,就全部替换。查看宏定义:命令模式下,光标放在待查看词上,[+d即可查看。d$:删除光标所在位置到行末,工作模式不变。D:删除光标所在位置到行末,工作模式不变。

2025-05-04 15:33:53 784

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除