c
文章平均质量分 66
lulu的云原生笔记
事在人为
展开
-
【博客610】linux “ip lias“ and “ip secondary“
以上两种方式都用来配置VIP,知名的高可用软件:heartbeat是用alias ip的方式,从heartbeat3开始,是用secondary ip,keepalived是用secondary ip的方式。工作中可以灵活的用上面两种方式。原创 2023-02-04 15:37:46 · 1415 阅读 · 1 评论 -
【博客565】nginx + keepalived实现高可用反向代理
注意:在listen那里要配置80这样的不带ip的,表示监听0.0.0.0:80,不可以将vip配置进去错误做法:listen vip:80错误原因:如果这样配,当vip飘走的时候,这个节点的nginx会启动失败,因为找不到有绑定vip的网卡,这样下次vip飘回来的时候,得重启nginx才能正常工作。原创 2022-12-24 10:56:51 · 1323 阅读 · 0 评论 -
【博客545】从交换机视角看四种报文:广播、组播、未知单播、已知单播
首先它是一个单播报文,那啥是单播报文呢?简单说除了广播和组播以外的报文,就是单播报文了,即目的MAC地址既不是全F,也不是01:00:5E开头的报文。当交换机收到目的MAC地址为0000:2222:2222报文时,会查找MAC地址表,发现没有表项存在,就认为这个报文是未知单播报文。相反的,当交换机收到目的MAC地址为0000:1111:1111报文时,能查找到表项,就认为这个报文是已知单播报文。那什么是未知单播报文呢?注意:准确来讲是其它的三种报文会从在同一个VLAN,所有UP的端口泛洪转发出去。原创 2022-11-28 22:00:34 · 4295 阅读 · 0 评论 -
【博客177】二进制中1的个数:方法三
内容: 记录求二进制中1的个数的另一种好方法:汉明重量计算算法最近在看redis源码,发现redis求二进制中1的个数的方法很赞,记录一下:代码:int vpSWAR(int i){ i = (i & 0x55555555) + ((i>>1) & 0x55555555); i = (i & 0x33333333) + ((i>&g...原创 2020-03-07 21:06:12 · 644 阅读 · 0 评论 -
【博客176】二进制中1的个数:方法二
内容: 记录另一种求二进制中1的个数的方法,这种方法的时间复杂度是O(1)代码:/*计算二进制中1的个数*/#include<stdio.h>int count(int num){ char p[256] = {0}; for (int i = 0; i < 256; i++) { p[i] = p[i / 2] + (i...原创 2020-03-07 20:54:59 · 421 阅读 · 0 评论 -
【博客175】二进制中1的个数:方法一
内容: 记录求二进制表示中,1的个数的方法代码:/*计算二进制中有多少个1*/#include<stdio.h>int count_1_in_binary(int num){ int count = 0; while (num) { count++; num &= num - 1; } r...原创 2020-03-07 20:49:11 · 370 阅读 · 0 评论 -
【博客174】base64编码:二(代码实现)
内容: 记录base64的代码实现:#ifndef _BASE64_INCLUDE__H__#define _BASE64_INCLUDE__H__// 存储编码结果需要的长度,包含\0的长度#define BASE64_ENCODE_LEN(A) ((A+2)/3 * 4 + 1)// 存储解码结果需要的长度,包含\0的长度#define BASE64_DECODE_LEN(A) ...原创 2020-03-07 20:33:23 · 328 阅读 · 0 评论 -
【博客173】base64编码:一(编码原理)
内容: 记录一种用于以8bit为单位的二进制编码方法base64编码的原理:1. Base64就是基于64个可打印字符来表示二进制数据2. 编码的规则: * 把3个字节变成4个字节(3*8 = 4*6 = 24) * 每76个字符加一个换行符 * 每个计算单位由原来的8位变成6位,所以还要在每组前面加两个0 * 原文的字节数量应该是3的倍数,如果这个条件不能满足的话:...原创 2020-03-07 20:31:33 · 458 阅读 · 0 评论 -
【计算机网络与网络编程】
以下为与计算机网络和网络编程相关的内容:【博客159】分散读(readv) 与集中写(writev)【博客109】bind绑定端口需要注意的问题【博客94】epoll手册的部分解读【博客93】对epoll监听的fd进行close会怎么样?【博客90】路由表中的0.0.0.0【博客88】traceroute原理简述【博客87】使用ping来检查你的网络问题【博客86】我用过的ubun...原创 2020-01-31 12:20:28 · 549 阅读 · 0 评论 -
【博客171】IPC(进程间通信)——共享内存(二)
内容:记录进程间的另一种通信方式:共享内存(mmap)函数接口:#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);int munmap(void *addr, size_t length);代码实践://发送#incl...原创 2020-02-23 18:39:05 · 370 阅读 · 0 评论 -
【博客170】IPC(进程间通信)——共享内存(一)
内容: 记录mmap的其它补充内容函数接口:#include <sys/mman.h>void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);形参说明:参数start:指向欲映射的内存起始地址,通常设为 NULL,让系统自动选定地址,映射成功后返回该地址。参数le...原创 2020-02-23 18:32:01 · 373 阅读 · 0 评论 -
【博客169】IPC(进程间通信)——信号
内容: 记录进程间通信的另一种方式:信号发送信号接口:int kill(pid_t pid, int sig);返回值说明:执行成功时:返回0执行失败时:返回-1;并且errno被设为以下的某个值 :1、EINVAL:指定的信号码无效(参数 sig 不合法) 2、EPERM;权限不够无法传送信号给指定进程 3、ESRCH:参数 pid 所指定的进程或进程组不存在形参说明:...原创 2020-02-23 17:41:06 · 338 阅读 · 0 评论 -
【博客168】IPC(进程间通信)——命名管道
内容: 命名管道是另一种管道,他可以在无血缘关系的进程之间使用函数原理:1、FIFO是linux基础文件类型中的一种,但FIFO文件在磁盘上没有数据,仅仅用来标识内核中一条通道。2、各进程可以打开这个文件进行read/write,实际上是读写内核通道,这样就实现了进程间通信。创建fifo文件函数接口:int mkfifo(const char *pathname,mode_t mod...原创 2020-02-23 16:53:30 · 387 阅读 · 0 评论 -
【博客167】IPC(进程间通信)——管道的原子性
内容: 管道其实是内存里的一块环形缓冲区,管道在使用的时候不一定都是原子性的管道的大小:管道的大小就是图中的pipe size: 512bytes × 8 = 4KB,(其中,512代表一个扇区的大小,8表示用了8个扇区,所以是4KB,大小可调节)阻塞与非阻塞对使用管道的区别:当没有数据可读时 O_NONBLOCK disable:read调用阻塞,即进程暂停执行,一直等到有...原创 2020-02-23 12:18:50 · 756 阅读 · 0 评论 -
【博客166】IPC(进程间通信)——管道的使用
内容: 记录进程间通信的其中一种方式:管道管道特点:原理: 管道实际是用于进程间通信的一段共享内存,一个进程在向管道写入数据后,另一进程就可以从管 道的另一端将其读取出来。 特点:1、管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。2、只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。比如fork或exec创建的新进程,在使用...原创 2020-02-23 11:30:57 · 395 阅读 · 0 评论 -
【博客165】子进程如何处理从父进程继承来的锁?
内容: 记录一下,子进程无法得知从父进程继承来的锁,那如何处理从父进程继承来的锁?问题引出:在多线程程序中一个线程调用fork,那么是否会产生和父进程一样的线程数呢?答案是:并不会的。当一个进程产生了子进程,那么子进程会从父进程那里继承过来锁的状态,也就是父进程上了锁,那么这个锁在子进程也是上着的。那么子进程并不知道从父进程继承来的锁的当前状态是什么,如果其它线程上了锁,它却不知道,再上...原创 2020-02-22 20:55:12 · 773 阅读 · 0 评论 -
【博客164】多线程情况如何处理信号处理
内容: 记录一下当一个进程有多线程的时候,信号处理应该怎么办?问题引出:1.同一个进程下的所有线程共享 信号的处理方式,所以一个线程改变对信号的处理方式,所有线程如果收到该信号都会是那样处理的。使得无法多个线程分别制定自己对信号的处理方式2.在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号,是异步的。但在多线程中处理信号的原则是:将对信号的异...原创 2020-02-22 20:14:11 · 1018 阅读 · 0 评论 -
【博客163】红黑树插入调整函数
内容: 代码是STL源码剖析里面的源码inline void _rb_tree_rebalance(_rb_tree_node_base* x , _rb_tree_node_base*& root){ x->color = _rb_tree_red; //新节点必为红 while(x != root && x->parent->color ...原创 2020-02-22 14:50:13 · 322 阅读 · 0 评论 -
【博客162】accept无法知晓连接队列里的连接状态!
内容: 最近看书的时候,发现一个accept函数是从连接队列里拿出一个连接,但是它并不知道当前拿出来的这个连接是有效连接还是已经是无效连接。测试代码:注意代码中listen函数后需要sleep,使得测试的连接来得及退出,保证accept函数执行前的连接队列里的连接是无效的#include <stdio.h>#include <string.h>#include &...原创 2020-02-22 14:14:54 · 418 阅读 · 0 评论 -
【博客161】fork与vfork的差别
内容: 记录创建子进程的函数fork与vfork的差别一. 进程空间共享程度的不同:vork创建子进程后,由于有读时共享,写时复制,所以当子进程不修改进程空间数据的时候,父子进程读出来的数据是一样的,但是如果子进程去修改进程空间数据,那么会引发缺页异常,重新分配新页。但是vfork并不会,父子进程共享同一个进程空间的,子进程的修改对父进程也会生效。原因:1.fork是子进程复制了父进...原创 2020-02-22 11:44:42 · 538 阅读 · 0 评论 -
【博客159】分散读(readv) 与集中写(writev)
内容: 记录一组为了减少系统调用的次数,采取用于分散读和集中写的函数,readv和writev。函数原型:#include<sys/uio.h>ssize_t readv(int filedes, const struct iovec *iov, int iovcnt);ssize_t writev(int filedes, const struct iovec *iov, i...原创 2020-01-30 13:34:45 · 1480 阅读 · 0 评论 -
【博客158】exit(0) 与 return 0 并不总是相等的!
内容: 在c语言中,exit(0); 和 return 0; 的差异不是特别的明显,但是在C++中是有区别的exit(0)与return 0 区别:1.c++中,编译器会将类析构函数的汇编代码插入到return前面,但对exit不作任何变动。return会自动调用对象的析构函数, 而exit不会2.exit是系统调用级别的,它表示了一个进程的结束,它将收回进程使用的内存空间,同时把错误信...原创 2020-01-29 19:46:29 · 410 阅读 · 0 评论 -
【博客157】函数返回时:exit 与 _exit 区别
内容: 当我们在函数返回的时候,除了使用return还可以用exit和_exit函数来退出程序一.函数原型:#include<stdlib.h>void exit(int status);#includ<unistd.h>void _exit(int status);二.函数区别:exit: 调用退出处理函数->作清理动作(例:对未关闭文件执行fcl...原创 2020-01-29 18:23:17 · 317 阅读 · 0 评论 -
【博客156】查看进程的环境
内容: 每个进程在运行的时候都会有它的环境参数,不是每个进程运行的时候环境变量都是一样的,当在不同的环境参数下运行可能会有不同的结果查看进程的环境参数有几种方法:1.使用env命令2.通过environ变量查看3.使用getenv函数查看方法一:方法二:方法三:注:1.可以使用setenv来设置环境变量2.libc中定义的全局变量environ指向环境变量表,...原创 2020-01-29 14:39:21 · 441 阅读 · 0 评论 -
【博客150】为什么引入库头文件就可以使用库函数而不需要与库函数c文件一起链接
内容: 实习的时候导师曾经问到过你知道为啥你的printf可以直接使用吗?你不需要将它的实现c文件一起链接也可以使用,甚至你不包含stdio.h文件也可以使用...原创 2019-12-17 10:42:48 · 1820 阅读 · 0 评论 -
【博客139】Linux信号处理之——阻塞信号
内容: 记录linux阻塞信号的知识信号在内核的状态:1.信号递达:实际执行信号的处理动作称为信号递达;2.信号未决:信号从产生到递达之间的状态;3.信号阻塞:被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作;内核进程控制块中函数有信号屏蔽状态字(block)和信号未决状态字(pending)——64bit,一个bit位代表一个信号:信号屏蔽状态字...原创 2019-12-07 22:07:07 · 462 阅读 · 0 评论 -
【博客129】执行系统调用函数system介绍
内容: 当我们写代码的时候需要在进程代码中去执行一个shell脚本,可以使用system()函数函数原型: int system(const char * string); 函数说明:system()会调用fork()产生子进程,由子进程来调用/bin/sh-c string来执行参数string字符串所代表的命令,此命>令执行完后随即返回原调用的进程。在调用system()期间...原创 2019-12-04 21:53:40 · 477 阅读 · 0 评论 -
【博客126】( 二 ) 使用libgc库来帮你管理内存
内容: 上一篇讲述了如何使用libgc帮你检测内存泄露,那么其实还可以使用libgc帮你管理内存,用它的接口分配的内存,当你一直泄露后其实是有被回收的使用:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <gc/gc.h>void test(){ cha...原创 2019-12-01 15:06:04 · 645 阅读 · 0 评论 -
【博客125】( 一 ) 使用libgc库来帮你防止内存泄露
内容: 在实习的时候科普知识的时候,有一个libgc库的学习使用,记录一下我的学习!我们首先看一个内存泄露的例子:#include <stdio.h>#include <stdlib.h>#include <unistd.h>void test(){ char *s = malloc(102400); *s = 0x10;}int main(...原创 2019-12-01 14:57:04 · 893 阅读 · 0 评论 -
【博客123】( 二 ) Linux—动态库
内容: 上一篇记录了静态库,现在记录一下动态库。当一个程序使用共享函数库时,在链接阶段并不把函数代码连接进来,而只是链接函数的一个引用。当最终的函数导入内存开始真正执行时,函数引用被解析,共享函数库的代码才真正导入到内存中。这样,共享链接库的函数就可以被许多程序同时共享,并且只需存储一次就可以了。共享函数库的另一个优点是,它可以实现函数体更新了,但是可执行文件不需要重新编译生成,只需要链接...原创 2019-11-30 21:30:59 · 199 阅读 · 0 评论 -
【博客119】__attribute__( ( format( printf,m,n ) ) )作用
内容: attribute( ( format( printf,m,n ) ) )这个这个句子之前很经常看到,但是一直没有去注意它的作用,直到最近在公司写业务代码的时候,出现了这个,所以这回学会了它的作用attribute是GNU C特色之一,在linux开发中用的比较广泛.系统中有许多地方使用到.attribute可以设置函数属性(Function Attribute )、变量属性(Vari...原创 2019-11-29 22:36:37 · 495 阅读 · 0 评论 -
【博客110】使输出重定向:dup与dup2
内容: Linux程序开发中,常遇到需要将某个文件描述符赋值给其他变量的情况。例如,将文件复制到标准输入输出中,这时就要使用dup或dup2函数。dup与dup2函数常用于实现输入、输出的重定向。dup2() 的用法,功能和 dup() 完全一样,但是 dup2() 复制出来的新文件描述符可以指定任意一个合法的数字。1.复制文件描述符用法:#include <stdio.h>#...原创 2019-11-24 22:18:59 · 347 阅读 · 0 评论 -
【博客109】bind绑定端口需要注意的问题
内容: 记录一下bind绑定端口需要注意的一些问题1.一个网络应用程序只能绑定一个端口( 一个套接字只能 绑定一个端口 ),因为消息就是根据端口来决定传给哪个进程的。2.对一个套接字绑定多个端口将会失败#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd...原创 2019-11-24 21:59:53 · 809 阅读 · 0 评论 -
【博客105】查看编译后的程序
内容: 程序经过预处理,编程了.i文件,.i文件经过编译会生成汇编文件,也就是.s文件准备好我们的c文件#include<stdio.h>#define print printf("\n start main\n");const int b =5;int main(void) //this is the main function !{ const i...原创 2019-11-24 13:03:10 · 373 阅读 · 0 评论 -
【博客104】查看预处理后的程序
内容: 查看预处理后的程序,最近实习的时候导师闲时问我有没有看过预处理是做了啥呀?想起来这个顺便记一下吧哈哈.准备好我们的程序:#include<stdio.h>#define print printf("\n start main\n");const int b =5;int main(void) //this is the main function !{ ...原创 2019-11-23 22:56:31 · 376 阅读 · 0 评论 -
【博客103】(二)利用gprof测试程序性能:结果分析
内容: 利用gprof测试程序性能,并进行结果查看接着文章一的操作结果,我们得到如下的数据:结果分析:结果分析:注意:1.大家注意到,其中调用的printf不在分析结果里面的,也就是库函数是不算在分析里面的。因为工作在内核态的函数和没有加-pg编译的第三方库函数是无法被gprof能够监控到的2.所以gprof 的最大缺陷:它只能分析应用程序在运行过程中所消耗掉的用户时间,无法得...原创 2019-11-23 22:34:44 · 576 阅读 · 0 评论 -
【博客102】(一)利用gprof测试程序性能:操作步骤
内容: 如何利用gprof测试程序性能1.准备好我们的程序:test1.c和test2.c#include<stdio.h> void new_fun(void); void fun1(void){ printf("\n start fun1\n"); for(int i = 0; i < 10; i++) { printf(...原创 2019-11-23 22:27:13 · 341 阅读 · 0 评论 -
【博客100】我的学习之路
内容: 从大一开始上C语言课程,就喜欢上编程,开始沿着兴趣爱好一步步学习到C++,到linux,到网络编程,系统编程,数据库等。到今天大四拿到offer,薪资也比较满意啦,一路走来,经历了很多很多,今天总结一下我的学习之路吧!大一以来完全看完和看了一般分的书籍:(支付宝教育统计,我在淘宝购买书籍的金额是7000多哈哈,自己都没想到过买了这么多的书,买书的时候确实很心疼哈哈,厚的一本就是一百多,...原创 2019-10-22 16:33:12 · 333 阅读 · 0 评论 -
【博客99】记录秋招面试 (五)
内容: 记录一次秋招以来最考验现场发挥的一次面试面试形式:视频面试面试岗位:C/C++面试问题:1.自我介绍2.C/C++哪个用得多?3.介绍项目4.介绍实习5.listen,bind,accept函数的形参和返回值,一个个函数来,每个都过一遍,问得比较细。每个形参意义,类型,返回值种类6.send和recv的返回值以及如何处理7.讲一下项目的整体工作流程8.实习期间聊聊9...原创 2019-10-22 15:44:42 · 338 阅读 · 0 评论 -
【博客98】记录秋招面试 (四)
内容: 继续记录秋招面试面试形式:现场面试面试岗位:C/C++面试问题:1.C++多态介绍2.讲一下为啥要有多态?意义呢?3.linux查看进程?4.linux查看剩余内存?5.看过的书6.讲一下你会的数据结构7.说一下TCP如何保证可靠性与有序性8.设计一个随机取电脑端口的函数(讲了蓄水池抽样定理,并在纸上证明后1.面试官继续提问是否有其他的解法?并告知需要考虑端口回收...原创 2019-10-22 15:33:02 · 319 阅读 · 0 评论