- 博客(103)
- 收藏
- 关注
原创 信号
信号信号的概念信号的机制与信号相关的事件和状态产生信号递达未决信号的处理方法阻塞信号集(信号屏蔽字)未决信号集信号的编号信号 4 要素信号的概念信号在我们的生活中随处可见, 如:古代战争中摔杯为号;现代战争中的信号弹;体育比赛中使用的信号枪…他们都有共性: 1. 简单 2. 不能携带大量信息 3. 满足某个特设条件才发送。信号是信息的载体, Linux/UNIX 环境下,古老、经典的通信方式, 现下依然是主要的通信手段。Unix 早期版本就提供了信号机制,但不可靠,信号可能丢失。Berkeley
2020-12-27 03:49:56 903 1
原创 Linux进程间通信
Linux进程间通信IPC方法管道管道的概念IPC方法Linux 环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间。任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能相互访问,要交换数据必须通过内核,在内核中开辟一块缓冲区,进程 1 把数据从用户空间拷到内核缓冲区,进程 2 再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC, InterProcess Communication)。在进程间完成数据传递需要借助操作系统提供特殊的方法,如:文件、管道、信
2020-12-08 14:39:24 195
原创 Linux进程概述
进程进程相关概念程序和进程并发单道程序设计多道程序设计CPU 和 MMU (虚拟内存映射单元)进程控制块 PCB进程状态环境变量常见环境变量PATHSHELLTERMLANGHOMEgetenv 函数setenv 函数unsetenv 函数进程控制fork 函数getpid 函数getppid 函数getuid 函数getgid 函数进程共享exec 函数族execlp 函数execl 函数execvp 函数exec 函数族一般规律回收子进程孤儿进程僵尸进程wait 函数进程相关概念程序和进程 程
2020-12-01 14:19:53 747
原创 spdlog自定义sink
spdlog自定义sinkspdlog自定义根据时间和文件大小来同时作为条件的sink.spdlog版本:1.11.0/*} };;/*public :// 判断是否是新的一天 if(should_rotate) {// 计算日志文件名 date_filename_ = filename;
2023-03-30 23:36:27 738
原创 epoll反应堆思想
epoll反应堆思想1 epoll反应堆思想2 epoll反应堆代码实现1 epoll反应堆思想epoll还有一种更高级的使用方法,那就是借鉴封装的思想,简单的说就是当某个事情发生了,自动的去处理这个事情。这样的思想对我们的编码来说就是设置回调,将文件描述符,对应的事件,和事件产生时的处理函数封装到一起,这样当某个文件描述符的事件发生了,回调函数会自动被触发,这就是所谓的反应堆思想。从我们之前对epoll的使用上如何去支持反应堆呢?需要重新再认识一下struct epoll_event中的epoll_
2021-04-22 00:40:05 583
转载 epoll进阶--事件模型(LT/ET)
epoll进阶--事件模型1 事件模型2 ET和LT比较3 示例3.1 基于管道epoll ET触发模式3.2 基于网络C/S模型的epoll ET触发模式3.3 基于网络C/S非阻塞模型的epoll ET触发模式 ★★1 事件模型EPOLL事件有两种模型:Edge Triggered (ET) 边缘触发只有数据到来才触发,不管缓存区中是否还有数据。Level Triggered (LT) 水平触发只要有数据都会触发。(epoll默认为LT模式)思考如下步骤:假定我们已经把一个用来从管
2021-04-21 00:50:39 350
原创 epoll
epoll1 epoll 相关函数2 epoll实现多路IO转接(代码)1 epoll 相关函数epoll_create 函数#include <sys/epoll.h>int epoll_create(int size) /* * function: 创建一个epoll句柄(创建一颗红黑树) * * function arguments: * argv1: 监听数目(创建的红黑树的监听节点数量) 【仅供内核参考】 * * ruturn value: * su
2021-04-20 21:51:07 248
原创 poll
poll1 poll 函数原型2 poll实现多路IO转接(代码)3 poll优缺点4 突破1024限制1 poll 函数原型#include <poll.h>int poll(struct pollfd *fds, nfds_t nfds, int timeout);struct pollfd { int fd; /* 文件描述符 */ short events; /* 监控的事件 */ short revents;
2021-04-16 00:24:01 218
原创 select
select1 select 函数原型2 select实现多路IO转接(代码)3 select优缺点4 优化1 select 函数原型#include <sys/select.h>/* According to earlier standards */#include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds, fd_set *readfds,
2021-04-12 22:09:12 117
原创 TCP状态转换以及端口复用
TCP状态转换1 图示2 状态转换分析3 设置端口复用4 半关闭函数1 图示粗实线代表主动端,虚线表示被动方,细实线表示一些其他状态。可以通过 netstat -apn | grpe 端口号 查看服务器/客户端的状态。2 状态转换分析主动发起连接请求端:CLOSE – 发送SYN – SEND_SYN – 接收ACK、SYN – 发送ACK – ESTABLISHED(数据通信状态)主动关闭连接请求端:ESTABLISHED(数据通信状态) – 发送FIN – FIN_WAIT_1
2021-04-12 20:19:52 762
原创 read/recv函数返回值
read/recv函数返回值在linux网络编程中:read/recv函数返回值> 0 实际读到的字节数= 0 已经读到结尾(对端已经关闭)-1 需要进一步判断errno的值errno = EAGAIN or EWOULDBLOCK 设置了非阻塞方式读,并且没有数据到达errno = EINTR 慢速系统调用被中断errno = “其他” 异常...
2021-04-11 02:15:06 323
原创 多线程并发服务器
多线程并发服务器1 多线程并发服务器思路分析2 多线程并发服务器代码实现1 多线程并发服务器思路分析2 多线程并发服务器代码实现#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <errno.h>
2021-04-11 02:00:37 233
原创 多进程并发服务器
多进程并发服务器1 多进程并发服务器思路分析2 多进程并发服务器代码实现1 多进程并发服务器思路分析2 多进程并发服务器代码实现#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <sys/socket.h>#include <arpa/inet.h>#include <signal.h>
2021-04-11 01:08:01 126
转载 socket编程错误处理函数封装代码
socket编程错误处理函数封装代码将c/s模型中常用函数的错误处理进行封装。(可突出代码的逻辑)wrap.h#ifndef __WRAP_H_#define __WRAP_H_#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <sys/socket.h>#in
2021-04-10 23:35:04 127
转载 滑动窗口(TCP流量控制)
滑动窗口1 滑动窗口(TCP流量控制)1 滑动窗口(TCP流量控制)对于UDP的描述:如果发送端发送的速度较快,接收端接收到数据后处理的速度较慢,而接收缓冲区的大小是固定的,就会丢失数据。TCP协议通过“滑动窗口(Sliding Window)”机制解决这一问题。看下图的通讯过程:发送端发起连接,声明最大段尺寸是1460,初始序号是0,窗口大小是4K,表示“我的接收缓冲区还有4K字节空闲,你发的数据不要超过4K”。接收端应答连接请求,声明最大段尺寸是1024,初始序号是8000,窗口大小是6K。发
2021-04-10 22:40:21 213
转载 网络名词术语解释
网络名词术语解释1 路由(route)2 路由器工作原理3 路由表(Routing Table)4 路由条目5 缺省路由条目6 路由节点7 以太网交换机工作原理8 hub工作原理9 半双工/全双工10 DNS服务器11 局域网(LAN)12 广域网(WAN)13 端口14 MTU1 路由(route)路由(名词)数据包从源地址到目的地址所经过的路径,由一系列路由节点组成。路由(动词)某个路由节点为数据包选择投递方向的选路过程。2 路由器工作原理路由器(Router)是连接因
2021-04-10 21:15:37 576
转载 网络基础
网络基础1 分成模型1.1 OSI七层模型1.2 TCP/IP四层模型2 协议的概念2.1 什么是协议2.2 典型协议3 网络应用程序设计模式3.1 C/S模式3.2 B/S模式3.3 优缺点4 数据通信过程分析5 协议格式5.1 数据包封装5.2 以太网帧格式5.3 ARP数据报格式5.4 IP段格式5.5 UDP数据报格式5.6 TCP数据报格式1 分成模型1.1 OSI七层模型物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(
2021-04-10 20:31:30 459
转载 TCP三次握手四次挥手
TCP三次握手四次挥手1 图示2 建立连接(三次握手)的过程3 数据传输的过程4 关闭连接(四次挥手)的过程5 扩展-telnet失败1 图示在这个例子中,首先客户端主动发起连接、发送请求,然后服务器端响应请求,然后客户端主动关闭连接。两条竖线表示通讯的两端,从上到下表示时间的先后顺序,注意,数据从一端传到网络的另一端也需要时间,所以图中的箭头都是斜的。双方发送的段按时间顺序编号为1-10,各段中的主要信息在箭头上标出,例如段2的箭头上标着SYN, 8000(0), ACK1001, ,表示该段中
2021-04-10 19:52:13 238
原创 TCP客户端与服务端代码
TCP客户端与服务端代码服务端客户端服务端#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <sys/socket.h>#include <sys/types.h>#include <arpa/inet.h>#include <ctype.h>int main(){
2021-04-10 19:18:47 263
原创 socket编程
socket编程1 套接字概念1 套接字概念Socket本身有“插座”的意思,在Linux环境下,用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。既然是文件,那么理所当然的,我们可以使用文件描述符引用套接字。与管道类似的,Linux系统将其封装成文件的目的是为了统一接口,使得读写套接字和读写文件的操作一致。区别是管道主要应用于本地进程间通信,而套接字多应用于网络进程间数据的传递。在TCP/IP协议中,“IP地址+TCP或UDP端口号”唯一标识网络通讯中的一个进程。“IP地址+
2021-04-10 19:02:57 236
原创 Linux线程(2)--线程同步(2)--条件变量、信号量
线程同步1 条件变量1.1 条件变量1.2 条件变量的主要相关函数1.3 生产者消费者模型1 条件变量1.1 条件变量条件变量本身不是锁!但它也可以造成线程阻塞。通常与互斥锁配合使用。给多线程提供一个会合的场所。1.2 条件变量的主要相关函数pthread_cond_t 类型 用户定义条件变量pthread_cond_t cond;1 初始化条件变量/* * function: 初始化一个条件变量 * * function arguments: * argv1: 条
2021-04-03 05:44:42 317
原创 Linux线程(2)--线程同步(1)--互斥锁、读写锁
线程同步1 线程同步的概念2 线程不同步导致的现象3 互斥锁(mutex)3.1 互斥锁的概念3.2 互斥锁的主要相关函数3.3 加锁与解锁3.4 互斥锁示例(使用互斥锁实现线程同步)4 死锁现象5 读写锁(rwlock)5.1 读写锁的概念5.2 读写锁的使用场合5.3 读写锁的特性5.4 读写锁的主要相关函数5.5 读写锁示例1 线程同步的概念线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。2 线程不同步导致的现象#in
2021-03-31 22:59:33 204
原创 Linux线程(1)--基本概念以及基本函数
Linux线程1 线程的基本概念2 线程共享资源3 线程非共享资源4 线程优、缺点5 pthread_create函数6 pthread_exit函数7 pthread_join函数1 线程的基本概念轻量级的进程(LWP:light weight process),在Linux环境下线程的本质任是进程。进程:拥有独立的地址空间,拥有PCB,相当于独居。线程:有PCB,但没有独立的地址空间,多个线程共享进程空间,相当于合租。在 Linux操作系统下:线程:最小的执行单位进程:
2021-03-29 23:14:04 413
原创 守护进程
守护进程1 守护进程介绍2 进程组和会话2 创建守护进程的模型4 案例1 守护进程介绍Daemon(精灵)进程,是 Linux 中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。一般采用以 d 结尾的名字。Linux 后台的一些系统服务进程,没有控制终端,不能直接和用户交互。不受用户登录、注销的影响,一直在运行着,他们都是守护进程。如:预读入缓输出机制的实现; ftp 服务器; nfs 服务器等。总结守护进程的特点:Linux后台服务进程独立于控制终端
2021-03-24 22:30:51 332 1
原创 函数指针和回调函数
函数指针和回调函数1 函数指针1.1 函数类型1.2 函数指针的定义方式2 回调函数2.1 什么是回调函数2.2 案例2.2.1 提供一个函数,通过传入的回调函数,实现打印任意类型的数据2.2.2 提供一个函数,通过传入回调函数,实现对任意类型的数组进行排序(选择排序,用户可以指定排序顺序)1 函数指针1.1 函数类型通过什么来区分两个不同的函数?一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。这一点和数组一样,因此我们可以用一个指针变量来存放这个入口地址
2021-03-23 00:12:09 352
原创 C语言文件操作
C语言文件操作1 文件打开关闭1.1 文件打开(fopen)1.2 文件关闭(fclose)2 文件读写2.1 按照字符读写文件2.2 按照行读写文件2.3 按照块读写文件2.4 按照格式化读写文件2.5 按照随机位置读写文件1 文件打开关闭1.1 文件打开(fopen)文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写)。FILE
2021-03-22 06:26:13 225
原创 二维数组名称的含义
二维数组名称的含义除了两种特殊情况,二维数组名都是指向二维数组中的第一个一维数组的数组指针。特殊情况一:sizeof(数组名) [统计数组长度]特殊情况二:&数组名 [对数组名取地址,得到的是二维的数组指针,数组指针的步长为整个二维数组的长度]#include <stdio.h>// 二维数组作为参数传递//void printArr(int arr[3][3], int row, int col) // int arr[3][3] 等价于 int (*arr)
2021-03-17 00:52:17 3230
原创 一维数组名的含义
一维数组名的含义除了两种特殊情况,一维数组名都是指向数组的第一个元素的指针。特殊情况一:sizeof(数组名) [统计数组长度]特殊情况二:&数组名 [对数组名取地址,得到的是数组指针,数组指针的步长为整个数组的长度]数组名是指针常量(int * const),指针的指向不可以修改,指针指向的值可以修改#include <stdio.h>// int arr[] 等价于 int *arr// int arr[] 的可读性更好void printfArr(int
2021-03-17 00:04:01 1623 1
原创 数组指针的定义方式
数组指针的定义方式通过typedef先定义出数组类型,再通过数组类型定义数组指针通过typedef先定义出数组指针类型,再通过数组指针类型定义数组指针直接定义数组指针#include <stdio.h>//1. 通过typedef先定义出数组类型,再通过数组类型定义数组指针void test01(){ int arr[5] = {1, 2, 3, 4, 5}; typedef int(ARRARY_TYPE)[5]; // ARRARY_TYPE为数组类型
2021-03-16 23:41:40 1027
原创 字符串格式化
字符串格式化1 sprintf2 sscanf1 sprintf#include <stdio.h>int sprintf(char *str, const char *format, ...);/*功能: 根据参数format字符串来转换并格式化数据,然后将结果输出到str指定的空间中,直到 出现字符串结束符 '\0' 为止。参数: str:字符串首地址 format:字符串格式,用法和printf()一样返回值: 成功:实际格式化的字符个数 失败:
2021-03-15 00:59:00 188
原创 C/C++程序的内存模型
C/C++中的内存分区我们先看着下面这一张我在下面参考文章1中找到的关于内存的图片,通过自己的理解分析一下。stack,即栈区。heap,即堆区。bss,即未初始化数据区。存放未初始或者初始化为0的全局变量和静态变量。生命周期是整个程序运行期间。gvar(global value),及数据区也叫data区。存放初始化不为0的全局变量和静态变量。生命周期是整个程序运行期间。text,即代码区。存放可执行文件的二进制代码以及常量(字符串常量和常变量)。生命周期是整个程序运行期间。通常将内存
2021-03-14 03:39:42 348 1
原创 STL容器使用时机
STL容器使用时机vector的使用场景:比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。deque的使用场景:比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加。如果采用vector,则头端移除时,会移动大量的数据,速度慢。vector与deque的比较:vector.at()比deque.at()效率高,比如vector.at(0)是固定的,deque的开始位置 却是不固定
2021-03-12 00:31:11 99
原创 STL常用容器(8)--map/multimap容器
STL常用容器--map/multimap容器1 map/multimap基本概念2 map/multimap常用API2.1 map构造函数2.2 map赋值操作2.3 map大小操作2.4 map插入数据元素操作2.5 map删除操作2.6 map查找操作3 案例3.1 Key为内置数据类型3.2 Key为自定义数据类型3.2.1 指定排序规则3.2.2 将自定义数据类型通过位域组成内置数据类型1 map/multimap基本概念map的特性是,所有元素都会根据元素的键值自动排序。map所有的元
2021-03-12 00:18:08 192
原创 STL常用容器(7)--set/multiset容器
STL常用容器--set/multiset容器1 set/multiset容器基本概念1.1 set容器基本概念1.2 multiset容器基本概念2 set常用API2.1 set构造函数2.2 set赋值操作2.3 set大小操作2.4 set插入和删除操作2.5 set查找操作3 对组(pair)1 set/multiset容器基本概念1.1 set容器基本概念set的特性是。所有元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实
2021-03-11 01:38:13 500
原创 STL常用容器(6)--list容器
STL常用容器--list容器1 list容器基本概念2 list容器的迭代器3 list容器的数据结构4 list常用API4.1 list构造函数4.2 list数据元素插入和删除操作4.3 list大小操作4.4 list赋值操作4.5 list数据的存取4.6 list反转排序5 案例1 list容器基本概念链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点
2021-03-10 20:54:47 313
原创 STL常用容器(5)--queue队列容器
STL常用容器--queue队列容器1 queue容器基本概念2 queue没有迭代器3 queue常用API3.1 queue构造函数3.2 queue存取、插入和删除操作3.3 queue赋值操作3.4 queue大小操作4 案例1 queue容器基本概念queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。2 queue没有迭代器queue所有元素的进出都必须符合”先进先出”的条件,只有qu
2021-03-09 23:54:07 244
原创 STL常用容器(4)--stack栈容器
STL常用容器--stack栈容器1 stack容器基本概念2 stack没有迭代器3 stack常用API3.1 stack构造函数3.2 stack赋值操作3.3 stack数据存取操作3.4 stack大小操作4 案例1 stack容器基本概念stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许
2021-03-09 20:58:29 272
原创 STL常用容器(3)--deque容器
STL常用容器--deque容器1 deque容器基本概念2 deque容器实现原理3 deque常用API3.1 deque构造函数3.2 deque赋值操作3.3 eque大小操作3.4 deque双端插入和删除操作3.5 deque数据存取3.6 deque插入操作3.7 deque删除操作4 案例4.1 实现deque升序降序排列4.2 有5名选手:选手ABCDE,10个评委分别对每一名选手打分,去除最高分,去除评委中最低分,取平均分。1 deque容器基本概念vector容器是单向开口
2021-03-08 01:22:41 554
原创 STL常用容器(2)--vector容器
STL常用容器--vector容器1 vector容器基本概念2 vector迭代器3 vector的数据结构4 vector常用API操作4.1 vector构造函数4.2 vector常用赋值操作4.3 vector大小操作4.4 vector数据存取操作4.5 vector插入和删除操作5 案例5.1 巧用swap收缩内存5.2 利用reserve预留空间5.3 逆序遍历1 vector容器基本概念vector的数据安排以及操作方式,与array非常相似,两者的唯一差别在于空间的运用的灵活性。Ar
2021-03-07 19:32:46 359
原创 STL常用容器(1)--string容器
STL常用容器--string容器1 string容器基本概念2 string容器常用操作2.1 string 构造函数2.2 string基本赋值操作2.3 string存取字符操作1 string容器基本概念C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件<string>。String和c风格字符串对比:Char是一个指针,String是一个类string封装了char,管理这个字符串,是一个
2021-03-07 04:51:38 168
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人