
Linux
文章平均质量分 75
Dominiczz
I have a big heart.
展开
-
关于c指针的一些说明
所以这样就好理解weston中的一些只有个声明的空指针到底是个啥玩意了。这里person就是一个声明指针,你让他指向谁都可以。,如果在不加const的情况下。原创 2024-11-07 11:57:24 · 212 阅读 · 0 评论 -
关于c语言回调函数的一些说明
在我们的代码中,常常把挂钩子的过程叫做注册,会提供一个注册函数,让使用者把自己编写的钩子函数挂在已经声明的函数指针上,这个注册函数的参数就是我们的函数指针了,比如,我们可以给刚才的函数指针提供一个注册函数。这里Max,Min函数就是钩子函数,把函数指针g_pFun指向函数Max,Min的过程,就是"挂钩子"的过程,相当于把钩子函数“挂到”函数指针上。最近的项目中涉及到很多c的代码,里面有一些信号槽机制,signal、listener、emit等。大家可以看到,同样是执行g_pFun,却执行的不同的函数。原创 2024-08-26 11:19:37 · 209 阅读 · 0 评论 -
CMake入门
CMake一般用来构建大型项目,为了弄清整个项目的结构,源码在哪里,生成的产物在哪里等等,了解CMake以后以上问题都会迎刃而解。# SET 指令的语法是:# VAR表示变量名称,VALUE表示变量的值,可以为多个,后面一些可选项,用到的时候查文档即可# 方式1: 各个源文件之间使用空格间隔# 方式2: 各个源文件之间使用分号;间隔div.c;main.c;mult.c;sub.c)原创 2024-07-22 17:59:21 · 660 阅读 · 0 评论 -
协程——uthread学习
调度器包括主函数的上下文main,包含当前调度器拥有的所有协程的vector类型的threads,以及指向当前正在执行的协程的编号running_thread.如果当前没有正在执行的协程时,running_thread=-1.ctx保存协程的上下文,stack为协程的栈,栈大小默认为DEFAULT_STACK_SZIE=128Kb.你可以根据自己的需求更改栈的大小。最重要的点:我感觉恢复上下文的时候,是恢复到下一行!func为协程执行的用户函数,arg为func的参数。更详细的介绍,请查看我的中文博客。原创 2024-07-19 23:38:28 · 605 阅读 · 0 评论 -
qdbus
qdbus是对dbus的进一步封装,dbus是基于c实现的,在这里不做过多介绍,一些基本的概念可以参考以下链接。原创 2024-04-23 19:37:26 · 393 阅读 · 0 评论 -
异步实现的一些方式
其实主要就是用到std::future和std::async这些,记录一下异步耗时操作是否结束。其实主要就是这一行代码。原创 2024-03-29 17:54:14 · 231 阅读 · 0 评论 -
I/O模型的一些理解
异步:把事情推到以后去做阻塞:专心做一件事情同步阻塞:马上专心做一件事情同步非阻塞:一边做一件事情,一边做另一件事情(一心二用)异步阻塞:把问题推到以后专心处理异步非阻塞:把问题推到以后时不时处理一下。原创 2024-03-28 16:29:49 · 1304 阅读 · 0 评论 -
ubuntu换源
【代码】ubuntu换源。原创 2024-02-05 10:15:39 · 410 阅读 · 0 评论 -
Webserver笔记
Timer这个文件包含两个类。原创 2024-02-05 10:10:40 · 620 阅读 · 0 评论 -
Webserver笔记
Timer这个文件包含两个类。原创 2024-07-19 23:38:54 · 536 阅读 · 0 评论 -
wsl(ubuntu22)安装mysql
【代码】wsl(ubuntu22)安装mysql。原创 2024-01-14 00:39:58 · 808 阅读 · 1 评论 -
Linux高性能服务器编程——学习笔记①
当发送端使用send或write向一个TCP连接写入数据的时候,内核中的TCP模块首先把这些数据复制到与该连接对应的TCP内核发送缓冲区中,然后TCP模块调用IP模块提供的服务,传递的参数包括TCP头部信息和TCP发送缓冲区中的数据,即TCP报文段。 第二,ARP请求和应答是从以太网驱动程序发出的,而并非像图中描述的那样从ARP模块直接发送到以太网上,所以我们将它们用虚线表示,这主要是为了体现携带ARP数据的以太网帧和其他以太网帧(比如携带IP数据报的以太网帧)的区别。如何将机器的域名转换成IP?原创 2024-01-13 16:33:58 · 1323 阅读 · 0 评论 -
C++线程同步之条件变量
看这块的时候,可以结合c里面的条件变量一起看,机制都一样,函数不一样罢了。条件变量是C++11提供的另外一种用于等待的同步机制,它能阻塞一个或多个线程,直到收到另外一个线程发出的通知或者超时时,才会唤醒当前阻塞的线程。条件变量需要和互斥量配合起来使用,C++11提供了两种条件变量:std::mutexnotify_one()或者唤醒一个或者所有被阻塞的线程。原创 2023-12-22 11:19:52 · 262 阅读 · 0 评论 -
UDP特性之广播
发送的ip统一填广播地址,比如10.82.254.255接收方的bind的ip要么INADDR_ANY要么具体的ip(这个好像不行,留个疑问)直接不填也行。原创 2023-12-14 14:33:49 · 274 阅读 · 0 评论 -
(important)关于socket的一些理解
因为之前都是统一指定的ip为127.0.0.1 一直只是尝试本机通信,明白上述三点以后,seraddr.sin_addr.s_addr到底应该填多少,相信大家心里都会清楚。然后再调用bind函数,表示服务端程序,允许任何本地IP地址接受连接,(因为可能有多个网卡,多个ip地址),同时绑定本地的9999端口。客户端的端口号应该是操作系统自动分配的。至于其他的通信函数,可以看之前写的文章。原创 2023-12-13 18:32:42 · 418 阅读 · 0 评论 -
基于UDP的套接字通信
udp是一个面向无连接的,不安全的,报式传输层协议,udp的通信过程默认也是阻塞的。UDP通信不需要建立连接,因此不需要进行connect()操作UDP通信过程中,每次都需要指定数据接收端的IP和端口,和发快递差不多UDP不对收到的数据进行排序,在UDP报文的首部中并没有关于数据顺序的信息UDP对接收到的数据报不回复确认信息,发送端不知道数据是否被正确接收,也不会重发数据。如果发生了数据丢失,不存在丢一半的情况,如果丢当前这个数据包就全部丢失了。原创 2023-12-13 14:37:19 · 165 阅读 · 0 评论 -
IO多路转接之epoll
epoll 全称 eventpoll,是 linux 内核实现IO多路转接/复用(IO multiplexing)的一个实现。IO多路转接的意思是在一个操作里同时监听多个输入输出源,在其中一个或多个输入输出源可用的时候返回,然后对其的进行读写操作。epoll是select和poll的升级版,相较于这两个前辈,epoll改进了工作方式,因此它更加高效。对于待检测集合select和poll是基于线性方式处理的,epoll是基于红黑树来管理待检测集合的。原创 2023-12-11 16:37:48 · 97 阅读 · 0 评论 -
IO多路转接之poll
从上面的测试代码可以得知,使用poll和select进行IO多路转接的处理思路是完全相同的,但是使用poll编写的代码看起来会更直观一些,select使用的位图的方式来标记要委托内核检测的文件描述符(每个比特位对应一个唯一的文件描述符),并且对这个。一点自己的思考:现在写的一些通信方式,都是基于固定大小的数组,是理想的情况,如果数组比较小,多次write或者多次read怎么解决?内核会根据第二个参数传递的值对参数1数组中的文件描述符进行线性遍历,这一点和select也是类似的。指定poll函数的阻塞时长。原创 2023-12-11 10:28:30 · 89 阅读 · 0 评论 -
关于read函数阻塞的问题
末尾提到了一点,服务端读取每次是读取10个字节的,如果超过10个字节,需要读取多次,但是客户端只会read一次,第二次read的时候,直接阻塞了。原创 2023-12-08 17:58:45 · 271 阅读 · 0 评论 -
IO多路转接之select
但是上面的客户端代码有个问题,就是服务端多次写入的时候,客户端只能收到前面10个字节的数据,但是如果循环调用read,客户端read会阻塞,因为这里服务端是不会主动发送数据的,只是把客户端传过来的数据重新传回去。在select()函数中第2、3、4个参数都是fd_set类型,它表示一个文件描述符的集合,类似于信号集 sigset_t,这个类型的数据有128个字节,也就是1024个标志位,和内核中文件描述符表中的文件描述符个数是一样的。IO多路转接也称为IO多路复用,它是一种网络通信的手段(机制),原创 2023-12-08 16:27:15 · 281 阅读 · 0 评论 -
Linux进程间通信方式——管道
不管是有血缘关系还是没有血缘关系,使用有名管道实现进程间通信的方式是相同的,就是在两个进程中分别以读、写的方式打开磁盘上的管道文件,得到用于读管道、写管道的文件描述符,就可以调用对应的read()、write()函数进行读写操作了。匿名管道是管道的一种,既然是匿名也就是说这个管道没有名字,但其本质是不变的,就是位于内核中的一块内存,匿名管道拥有上面介绍的管道的所有特性,额外的我们需要知道,第一步: 在父进程中创建了匿名管道,得到了两个分配的文件描述符,fd3操作管道的读端,fd4操作管道的写端。原创 2023-12-01 18:04:19 · 102 阅读 · 0 评论 -
C语言查看main函数的参数
argc 代表参数的个数argv 代表参数的具体值,其中argv [ 0 ] 代表的是可执行文件的名字,参考上图。原创 2023-11-15 14:19:43 · 107 阅读 · 0 评论 -
linux线程详解
线程c版本1、线程概述2、创建线程3、线程退出4、线程回收使用子线程栈使用全局变量使用主线程栈5、线程分离6、其他线程函数线程取消6.2 线程ID比较C++版本1、构造函数2、公共成员函数2.1 get_id()2.2 join()2.3 detach()2.4 joinable()2.5 operator()3、静态函数4、C++线程命名空间4.1 get_id()4.2 sleep_for()4.3 sleep_until()4.4 yield()参考链接c版本1、线程概述线程是轻量级的进程(L原创 2023-11-28 17:40:43 · 166 阅读 · 0 评论 -
Linux线程池
【代码】Linux线程池。原创 2023-11-29 20:06:51 · 113 阅读 · 0 评论 -
Linux使用
Linux基本命令原创 2022-06-28 17:23:58 · 131 阅读 · 0 评论 -
Linux多线程同步
一般情况下,每一个共享资源对应一个把互斥锁,锁的个数和线程的个数无关。当线程调用这个函数,并且sem中的资源数>0,线程不会阻塞,线程会占用sem中的一个资源,因此资源数-1,直到sem中的资源数减为0时,资源被耗尽,但是线程不会被阻塞,直接返回错误号,因此可以在程序中添加判断分支,用于处理获取资源失败之后的情况。当线程调用这个函数,并且sem中的资源数>0,线程不会阻塞,线程会占用sem中的一个资源,因此资源数-1,直到sem中的资源数减为0时,资源被耗尽,因此线程也就被阻塞了。原创 2023-11-29 15:29:13 · 1147 阅读 · 0 评论 -
Linux下socket以及并发
socket通信过程中,读/写和单线程/多线程中都会存在阻塞问题,可以根据输出验证。比如上面注释的一行sendto,反注释掉的话,会交替打印两个send信息。服务端持续接收客户端请求,其实就是加了个while循环。原创 2023-11-16 16:30:36 · 451 阅读 · 0 评论 -
Linux进程通信——内存映射mmap
如上图所示:磁盘文件数据可以完全加载到进程的内存映射区也可以部分加载到进程的内存映射区,当进程A中的内存映射区数据被修改了,数据会被自动同步到磁盘文件,同时和磁盘文件建立映射关系的其他进程内存映射区中的数据也会和磁盘文件进行数据的实时同步,这个同步机制保障了各个进程之间的数据共享。使用内存映射区除了可以实现进程间通信,也可以进行文件的拷贝,使用这种方式拷贝文件可以减少程序猿的工作量,我们只需要负责创建内存映射区和打开磁盘文件,关于文件中的数据读写就无需关心了。原创 2023-12-04 15:07:17 · 131 阅读 · 0 评论 -
linux下环境变量配置
【代码】linux下环境变量配置。原创 2023-11-18 00:42:19 · 86 阅读 · 0 评论 -
进程API
【代码】fork函数的测试。原创 2023-11-22 19:45:02 · 119 阅读 · 0 评论 -
Linux进程详解
从严格意义上来讲,程序和进程是两个不同的概念,他们的状态,占用的系统资源都是不同的。程序:就是磁盘上的可执行文件文件, 并且只占用磁盘上的空间,是一个静态的概念。进程:被执行之后的程序叫做进程,不占用磁盘空间,需要消耗系统的内存,CPU资源,每个运行的进程的都对应一个属于自己的虚拟地址空间,这是一个动态的概念。原创 2023-12-01 17:03:19 · 258 阅读 · 0 评论 -
Linux设置可执行文件全局可用
将可执行文件复制到 /usr/local/bin 目录下即可。还有其他方法,后面再学习。原创 2023-11-10 17:33:13 · 313 阅读 · 0 评论 -
TCP数据粘包的处理
关于数据包的包头大小可以根据自己的实际需求进行设定,这里没有啥特殊需求,因此规定包头的固定大小为4个字节,用于存储当前数据块的总字节数。但是这种叫法不太对的,本身TCP就是面向连接的流式传输协议,特性如此,我们却说是TCP这个协议出了问题,这只能说是使用者的无知。多个数据包粘连到一起无法拆分是我们的需求过于复杂造成的,是程序猿的问题而不是协议的问题,TCP协议表示这锅它不想背。因为数据的传输是基于流的所以发送端和接收端每次处理的数据的量,处理数据的频率可以不是对等的,可以按照自身需求来进行决策。原创 2023-12-07 16:39:11 · 316 阅读 · 0 评论 -
Linux进程间通信——共享内存
共享内存不同于内存映射区,它不属于任何进程,并且不受进程生命周期的影响。通过调用Linux提供的系统函数就可得到这块共享内存。使用之前需要让进程和共享内存进行关联,得到共享内存的起始地址之后就可以直接进行读写操作了,进程也可以和这块共享内存解除关联, 解除关联之后就不能操作这块共享内存了。在所有进程间通信的方式中共享内存的效率是最高的。共享内存操作默认不阻塞,如果多个进程同时读写共享内存,可能出现数据混乱,共享内存需要借助其他机制来保证进程间的数据同步,比如:信号量,共享内存内部没有提供这种机制。原创 2023-12-04 15:48:11 · 194 阅读 · 0 评论 -
套接字通信类的封装
/ 创建监套接字return -1;printf("套接字创建成功, fd=%d\n", fd);return fd;// 绑定本地的IP和端口return -1;printf("套接字绑定成功, ip: %s, port: %d\n",return ret;// 设置监听return -1;printf("设置监听成功...\n");return ret;// 阻塞并等待客户端的连接elsereturn -1;原创 2023-12-07 19:51:53 · 115 阅读 · 0 评论