
Linux
Linux
Michael_Good
脚踏实地,不负时光!
展开
-
【Linux】container_of 的使用心得。
总结下container_of的原理。原创 2025-01-11 14:39:07 · 138 阅读 · 0 评论 -
【C/C++】C++新特性实践方向
C++ 新特性核心内容,主要关注点:原创 2025-01-06 11:04:29 · 185 阅读 · 0 评论 -
【C/C++】nlohmann::json的优劣
最近在使用作为数据结构辅助,进行分析了下nlohmann::json的优劣,以及适用的场景。原创 2025-01-03 11:59:00 · 1416 阅读 · 0 评论 -
【C/C++】C语言打印十六进制数据
2、使用PRIx64 和 PRIu64 宏(需要头文件 inttypes.h,支持跨平台)1、使用 "%llu"格式说明符。原创 2025-01-02 13:51:59 · 984 阅读 · 0 评论 -
【操作系统】为什么需要架构裁剪?
为什么需要架构裁剪?原因减小核心大小提高架构初始化速度降低内存占用提高系统性能移除不需要的功能,增加安全性裁剪方法初始化配置设置功能模块化移除不需要的驱动底层一般裁剪对象(以操作系统为例)文件系统的支持网络协议栈设备驱动程序调试和追踪程序电源管理功能虚拟化功能原创 2024-12-18 19:58:58 · 251 阅读 · 0 评论 -
【消息中间件】什么是MQTT?优势是什么?
一种针对移动终端设备的基于TCP/IP的发布订阅协议,可以连接大量远程边缘设备(如传感器、控制设备)。特点是,可以保持长连接,具有一定的实时性。2、“至少1次”:发生消息重复,不关注。即,出现消息丢失后,发送者会进行发送多次,直至觉察到接收者接收到了,重复接收几个相同的消息,也不care。1、”至多1次”:发生消息丢失,不关注。即,发送者仅发送1次,接收者能不能收到,不care。3、“只有1次”:确保消息仅仅到达1次。使用发布订阅模式,提供一对多的消息发布,解除应用程序的耦合。发布者、订阅者、代理中心。原创 2024-12-16 09:36:39 · 356 阅读 · 0 评论 -
【C/C++】事件驱动架构中,高性能位移操作事件状态位的优势
会清除EVENT_ONE的状态,而不会影响其他标志的状态。原创 2024-12-14 11:35:36 · 915 阅读 · 0 评论 -
【C/C++】使用位移操作符定义枚举成员的性能优势,以及实践场景
在 C 或 C++ 中,使用位移操作符(原创 2024-12-14 11:26:45 · 797 阅读 · 0 评论 -
【架构设计】关于架构设计的一些思考
面向过程->面向对象->函数式编程。原创 2024-12-10 15:23:32 · 900 阅读 · 0 评论 -
【IO】关于DMA、零拷贝技术笔记
DMA(Direct Memory Access,直接内存访问)控制器是一种硬件组件,它允许外部设备直接与系统内存进行数据传输,而无需中央处理器(CPU)的直接干预。DMA 控制器的设计和实现原理旨在提高数据传输的效率和系统的整体性能。零拷贝是一种思想,目标是降低内存拷贝次数。DMA技术仅仅是减少了CPU上下文切换、调用负担。上层系统减少了一次拷贝,但是这次拷贝是交给了DMA控制器进行执行,从整体(DMA+原系统)上来说,并没有减少拷贝次数。原创 2024-11-28 15:36:37 · 895 阅读 · 0 评论 -
【计算机网络】C/C++实现解析Wireshark离线数据包,附源码
是 libpcap 库中的一个重要函数,用于打开一个包含已捕获数据包的文件,以便进行离线分析。这个函数在网络安全分析、协议分析等领域有着广泛的应用。接下来,函数会读取文件头信息,以验证文件格式是否符合 libpcap 的要求。文件头包含了一些重要的元数据,如魔数、版本号等。读取文件头后,函数会进行一系列校验,确保文件格式正确。如果文件不存在或无法打开,函数会返回。指针,以便后续调用其他 libpcap 函数进行数据包处理。如果文件头校验通过,函数会初始化一个。函数打开一个捕获文件并读取数据包。原创 2024-11-26 12:16:11 · 842 阅读 · 0 评论 -
【cmake】关于cmake构建系统Ninja
p 选项表示“parents”,即递归地创建目录。如果上级目录不存在,mkdir -p 会自动创建所有必要的上级目录。如果 path 或 to 目录不存在,mkdir -p 会自动创建它们。原创 2024-11-19 11:29:51 · 1178 阅读 · 0 评论 -
【Linux】mkdir -p 命令
p 选项表示“parents”,即递归地创建目录。如果上级目录不存在,mkdir -p 会自动创建所有必要的上级目录。如果 path 或 to 目录不存在,mkdir -p 会自动创建它们。原创 2024-11-19 09:11:00 · 657 阅读 · 0 评论 -
【事件IO分类】什么是慢IO事件,什么是快IO事件?
在大家耳熟能详的事件驱动框架,比如libevent libev libuv等,其中都会对IO进行分类,从而更高效的进行处理,而不阻塞整体运行流程。就是IO阻塞时间较短,比如:本地文件操作。当然,这里,所说的快,也是相对而言。也存在文件操作阻塞时间很长的场景。就是IO会长时间阻塞,比如:DNS解析。原创 2024-09-06 11:53:12 · 470 阅读 · 0 评论 -
【C/C++】Linux\Windows为什么频繁使用size_t
在32位系统上,size_t 通常是 unsigned int,而在64位系统上,它通常是 unsigned long 或 unsigned long long。例如,malloc 和 calloc 函数返回 void* 类型的指针,而它们的参数类型是 size_t,这允许函数接受任何大小的整数值作为参数,而无需担心类型不匹配。例如,strlen 函数返回一个 size_t 类型的值,表示字符串的长度;由于它是无符号的,因此在进行算术运算时,不会出现负数结果,这有助于避免一些常见的错误,如数组越界。原创 2024-09-06 11:47:00 · 365 阅读 · 0 评论 -
【架构设计】什么是语义分离?有什么优缺点?
语义分离(Semantic Separation)指在软件设计和架构中,将不同的功能、职责或概念明确地划分开来,使得它们在逻辑上和实现上保持独立。这种分离有助于提高代码的可读性、可维护性和可扩展性。语义分离通常涉及将系统分解为更小、更易于管理的部分,每个部分都有明确的职责和接口。原创 2024-08-27 15:23:02 · 315 阅读 · 0 评论 -
【架构设计】高性能定时器方案选型,以及适用场景
比如在Linux中,可以通过SIGALARM信号进行实现。显然,(1)开销太大了;(2)完全依赖于操作系统,无法进行管理;(3)SIGALARM信号最小粒度为秒级,粒度太大了,满足不了我们的需求。可以实现,当然问题也很明显:链表的插入效率较低,而且遍历超时事件时,需要遍历很长的链表,效率低,自然开销大。对比下来,满足需求,且性能OK。插入:O(logn);2.应用层开启单独线程+Sleep进行计时。确实实现起来简单,问题也很显然:性能开销大。为什么需要高性能定时器(适用场景)?原创 2024-08-22 16:37:54 · 177 阅读 · 0 评论 -
【cmake】关于cmake链接库的顺序要求
命令来指定链接顺序。这个命令接受一个目标(target)和一系列库(库可以是库目标、库文件路径或导入的库目标)作为参数。链接顺序通常很重要,特别是当库之间存在依赖关系时。链接顺序通常遵循依赖关系,即依赖于其他库的库应该在被依赖的库之后列出。如果库之间没有依赖关系,链接顺序可能不那么重要,但最好保持一致的顺序以避免混淆。是指定链接作用域的关键字(可以是。),后面跟着一系列库。,这反映了它们之间的依赖关系。在CMake中,你可以使用。原创 2024-08-15 15:56:42 · 745 阅读 · 0 评论 -
【C/C++】实现高性能日志轮转功能,已实测
这个程序会检查日志文件的大小,如果超过预设的大小限制,则将当前日志文件重命名,并创建一个新的日志文件。因此,压缩操作通常在日志文件轮转时执行,此时日志文件被关闭,不再有新的写入操作。如果当前日志文件的大小超过了预设的限制,它会将当前日志文件重命名为包含当前时间戳的新文件名,并创建一个新的空日志文件。确保压缩过程中的数据完整性涉及多个方面,包括文件的完整性、压缩过程的正确性以及压缩后文件的可用性。:在压缩之前,确保当前正在写入的日志文件被关闭,以避免在压缩过程中写入数据。:压缩完成后,删除原始的旧日志文件。原创 2024-06-17 23:56:47 · 1323 阅读 · 0 评论 -
【C/C++】工业级别的日志文件轮转策略原理
日志文件轮转(Log Rotation)是一种日志管理策略,用于自动管理日志文件的大小和数量。随着应用程序运行时间的增加,日志文件可能会变得非常大,这不仅会占用大量的磁盘空间,还可能影响应用程序的性能。日志文件轮转通过定期地将当前的日志文件重命名或移动到另一个位置,并创建一个新的日志文件来解决这个问题。:当日志文件达到预设的最大大小时,轮转会自动发生。是一个常用的日志文件轮转工具,它能够自动处理日志文件的轮转、压缩和删除。:在轮转过程中,旧的日志文件可以被压缩或归档,以节省磁盘空间并便于长期存储。原创 2024-06-17 23:39:54 · 410 阅读 · 0 评论 -
【后端技术】Nginx配置文件基本说明和使用,亲测可行
Nginx 是一个高性能的 HTTP 和反向代理服务器,以及 IMAP/POP3 代理服务器。它以其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。配置文件的修改通常需要重启 Nginx 服务以使更改生效。在实际使用中,你可能需要根据自己的需求添加或修改配置。例如,如果你需要配置 SSL/TLS 加密通信,你可能需要添加。如果有错误,它会指出错误的位置和原因。相关的配置块,并指定证书和密钥文件的位置。如果你需要配置反向代理,你可能需要在。,但具体位置可能会根据你的操作系统和安装方式有所不同。原创 2024-06-09 20:34:26 · 241 阅读 · 0 评论 -
【Linux】Linux定时器使用及代码案例
在 Linux 中,可以使用定时器来实现一些定时任务,例如定时发送信号、定时执行某个函数等。设置定时器参数:然后需要设置定时器的参数,包括定时器的类型、定时器的超时时间、定时器的回调函数等。定义定时器结构体:首先需要定义一个定时器结构体,用于存储定时器的相关信息。启动定时器:最后需要启动定时器,使其开始计时。函数启动了定时器,并设置了定时器的超时时间和回调函数。函数注册了一个信号处理函数,用于处理定时器超时时的信号。函数来启动定时器,并设置定时器的超时时间和回调函数。函数创建了一个定时器,并使用。原创 2023-05-11 17:10:55 · 1793 阅读 · 0 评论 -
【Linux】Makefile 编写教程
该Makefile可以根据实际情况进行修改,例如添加头文件路径、库文件路径和库文件等。:目标文件规则,依赖于对应的源文件,使用编译器。:目标程序规则,依赖于目标文件列表。原创 2023-05-10 15:59:31 · 1197 阅读 · 0 评论 -
【Linux】error: implicit declaration of function ‘sleep’ [-Werror=implicit-function-declaration]
选项,那么编译器会将所有警告视为错误,导致编译失败。如果不想让这个警告成为错误,可以使用。函数是一个标准库函数,用于让程序暂停一段时间。因此,如果要在代码中使用。这个错误提示是因为在代码中调用了。在这个例子中,我们在代码中包含了。需要注意的是,如果在编译时启用了。头文件,导致编译器无法识别。选项来禁用这个警告。函数,需要在代码中包含。的警告,编译也不会失败。原创 2023-05-10 10:54:18 · 3359 阅读 · 1 评论 -
【Linux】Linux 平台获取指定目录文件列表
参数是要打开的目录名,可以是绝对路径或相对路径。参数是要关闭的目录流指针。如果关闭成功,返回 0,否则返回 -1。函数,直到读取到所有的目录项。每次读取到一个目录项后,可以使用。函数返回的目录流指针。如果读取成功,返回一个指向。类型的指针,表示读取到的目录项。函数打开要遍历的目录,该函数返回一个指向。类型的指针,表示打开的目录流。函数读取目录中的文件,该函数返回一个指向。函数关闭目录流,释放资源。函数,读取目录中的文件,最后使用。在上面的例子中,首先使用。类型的指针,否则返回。类型的指针,否则返回。原创 2023-05-08 20:58:55 · 1481 阅读 · 1 评论 -
【Linux】Linux 平台实现插件式架构
下面是一个简单的 Makefile 文件,用于编译生成名为。的函数,用于计算两个整数的和。在上面的例子中,首先使用。的共享库文件,可以使用上面的例子来加载并调用其中的函数。在上面的 Makefile 文件中,首先定义了。需要注意的是,这里使用了。目标,用于清除生成的目标文件和共享库文件。目标,用于编译生成目标文件。目标,即编译生成源文件。要解决这个错误,可以在编译时添加。的共享库,其中定义了一个名为。命令即可编译生成共享库文件。函数加载共享库,然后使用。编译完成后,会生成一个名为。原创 2023-05-08 20:29:42 · 787 阅读 · 0 评论 -
【Linux】 Linux 平台如何查看SO符号表
该命令会输出共享库中的所有符号列表,包括函数和变量,以及它们的地址和类型等信息。需要注意的是,共享库中的符号可能会被重命名或隐藏,以避免命名冲突和符号泄露等问题,因此需要遵循一定的规范来管理共享库中的符号。表示要查看的共享库文件名,可以是绝对路径或相对路径。命令来查看一个共享库(也称为动态链接库或。文件)中的符号(函数或变量)列表。在 Linux 平台上,可以使用。(显示 C++ 符号名)和。表示选项,常用的选项有。(显示调试符号表)等;(显示动态符号表)、原创 2023-05-08 20:23:30 · 5028 阅读 · 0 评论 -
【Linux Shell】 整数大小比较
shell中整数大小比较。原创 2023-04-10 15:43:18 · 1012 阅读 · 0 评论 -
Linux Kernel - 关于 sock_def_readable 的探讨
在 sock_def_readable 函数中,内核会首先检查套接字的 sk->sk_shutdown 是否包含 RCV_SHUTDOWN 标志,如果是,则表示套接字已经关闭接收端,不再可读。例如,TCP 套接字的 sock->ops->poll 函数会检查接收缓冲区是否有数据可读,而 UDP 套接字的 sock->ops->poll 函数则会直接返回 1,表示套接字始终可读。对于可读条件,内核会调用套接字的 sock->ops->poll 函数,该函数会返回一个掩码,表示套接字是否可读。原创 2023-04-07 08:58:47 · 515 阅读 · 0 评论