dlz0836
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入掌握 CMSG_SPACE 与 CMSG_LEN
摘要:在UNIX域套接字中,CMSG_SPACE和CMSG_LEN宏用于处理控制消息的空间分配和长度计算。CMSG_LEN计算控制消息头部和数据部分的实际长度(不含padding),用于设置cmsg_len字段;而CMSG_SPACE计算包含对齐padding的完整缓冲区大小,用于分配msg_control空间。典型应用包括传递文件描述符(SCM_RIGHTS)和进程凭证(SCM_CREDENTIALS)。常见错误包括混淆两宏用途导致缓冲区截断或解析失败。正确用法是:cmsg->cmsg_len用CM原创 2025-06-30 09:09:51 · 33 阅读 · 0 评论 -
详解 recvmsg() 和 sendmsg() (四)-使用 sendmsg() / recvmsg() 实现 多文件描述符同时传递 和 带超时的接收操作(基于 select() 实现简单超时)
先准备文件:tdtest.txt 和 fdtest2.txt。多 FD 传递受限于内核限制(一般几百个以内都没问题)发送方尽量不要一次传过多文件描述符,保持合理范围。原创 2025-06-28 14:50:27 · 30 阅读 · 0 评论 -
详解 recvmsg() 和 sendmsg() (三)-使用 sendmsg() / recvmsg() 实现 同时发送普通数据 + 文件描述符(FD)
这里是一个更完整的,支持,以及对应的接收函数。原创 2025-06-28 10:24:33 · 24 阅读 · 0 评论 -
详解 recvmsg() 和 sendmsg() (二)-使用 sendmsg() / recvmsg() 实现 文件描述符(FD)传递
/ send_fd() - 通过 socket 发送一个文件描述符// recv_fd() - 从 socket 接收一个文件描述符。原创 2025-06-28 09:56:45 · 29 阅读 · 0 评论 -
详解 recvmsg() 和 sendmsg() (一)
用法场景你需要做的事传递文件描述符用SCM_RIGHTS多 buffer 高效写入使用多个iovec权限隔离通信父子进程通过 socketpair + sendmsg/recvmsg多控制消息遍历cmsghdr结构链。原创 2025-06-28 09:24:51 · 61 阅读 · 0 评论 -
C网络编程 详解 CMSG_FIRSTHDR和CMSG_DATA
在使用recvmsg()和sendmsg()进行高级套接字通信时,我们可以传递:主数据:通常通过接收控制数据(Control Message):通过来接收额外信息,如:文件描述符(FD) ➜SCM_RIGHTS权限信息 ➜这些控制信息就是通过(control message header)组织的。宏名用途获取第一个控制消息头获取控制数据指针(如文件描述符)申请包含对齐空间的总缓冲大小设置控制头中的有效长度。原创 2025-06-26 13:44:30 · 28 阅读 · 0 评论 -
一个完整的 C 语言示例程序实现 License 签名+验证
这是一个基于OpenSSL和Jansson库的C语言许可证验证工具,主要功能包括: 支持RSA签名和验证操作 包含机器码绑定功能(通过/etc/machine-id) 具备时间限制校验(YYYY-MM-DD格式) 使用JSON格式存储许可证信息 工具使用流程: 生成RSA密钥对(私钥签名/公钥验证) 创建包含用户、过期时间和机器ID的JSON许可证文件 使用签名功能生成数字签名 验证时检查签名有效性、机器ID匹配和过期时间 编译需链接crypto和jansson库,适用于Linux系统,可根据需要修改机器I原创 2025-06-24 16:56:54 · 208 阅读 · 0 评论 -
C 典型多进程并发服务器模式 —— 父进程接收连接后 fork() 出子进程专门处理该连接。
摘要: 该函数实现了一个FTP服务器的客户端连接处理机制,通过accept()接收连接请求后fork()子进程处理。主要功能包括:1) 校验客户端IP类型;2) 执行最大用户数和单IP连接数限制;3) 使用信号屏蔽保护全局计数变量;4) 父子进程分工明确,子进程处理业务,父进程继续监听。代码展示了UNIX多进程服务器的典型模式,涉及socket编程、进程控制、资源共享(文件描述符)与隔离(内存空间)等核心概念。特别值得注意的是使用_EXIT()安全终止子进程,以及通过iptrack机制实现的连接数控制。原创 2025-06-23 20:05:57 · 20 阅读 · 0 评论 -
C 多进程服务器中安全地更新全局变量(增加子进程计数)
本文介绍了在多进程服务器编程中如何安全处理SIGCHLD信号和子进程计数。主要内容包括:通过sigemptyset()初始化信号集,sigaddset()添加SIGCHLD信号,并使用sigprocmask()暂时阻塞该信号,确保在修改子进程计数变量(nb_children++)时不会被信号处理程序中断。这种方法解决了主程序修改计数时可能因收到SIGCHLD信号而导致的竞态问题。文章还解释了为何在多进程而非多线程环境下选择信号屏蔽而非互斥锁来保证数据一致性。这些技术是Unix多进程编程中管理信号敏感区和进程原创 2025-06-23 19:28:14 · 16 阅读 · 0 评论 -
C 主循环中的 socket 多路监听处理逻辑
摘要:该代码展示了使用select系统调用同时监听IPv4和IPv6套接字的实现。核心功能包括:1)初始化fd_set并设置监听套接字;2)计算select所需的max_fd参数;3)在循环中调用select等待连接;4)处理select中断和错误;5)通过FD_ISSET检查就绪套接字并调用accept处理连接。代码体现了select多路复用的典型用法,包含错误恢复、双栈支持和循环控制等关键技术点,但存在select性能随fd数量下降的局限性(建议后续可改用epoll优化)。原创 2025-06-23 17:40:57 · 22 阅读 · 0 评论 -
C 创建一个 TCP 监听 socket
摘要: 该代码片段实现了一个独立的TCP服务器初始化过程,核心步骤包括:通过getaddrinfo()解析监听地址,创建非阻塞socket并设置SO_REUSEADDR避免端口占用,通过条件编译支持TCP_FASTOPEN加速连接,动态计算backlog队列长度后绑定端口并启动监听。关键编程技巧包括:使用AI_PASSIVE标志生成监听地址,设置FD_CLOEXEC防止文件描述符泄漏,以及完善的错误处理机制(如失败时释放资源并记录日志)。该实现兼顾跨平台兼容性(IPv4/IPv6)与性能优化(动态backl原创 2025-06-23 17:05:32 · 27 阅读 · 0 评论 -
C 生成/更新一个 pid 文件
摘要:该代码实现了一个安全的PID文件更新机制,用于后台守护进程管理。主要流程包括:1)使用snprintf安全格式化PID到缓冲区;2)用unlink删除旧PID文件并处理错误;3)通过open创建新文件(O_NOFOLLOW防止符号链接攻击);4)用safe_write确保完整写入(POSIX系统调用封装)。关键技术点涉及进程ID获取、文件安全操作(权限0644)、防缓冲区溢出及符号链接攻击防护,体现了Unix系统编程的安全实践。代码最后确保失败时文件清空,避免残留数据。原创 2025-06-23 15:03:08 · 18 阅读 · 0 评论 -
fcntl() 文件锁的用法与它在进程间同步中的作用
摘要:文件锁(fcntl())用于解决多进程/线程并发访问共享文件时的数据竞争问题,提供两种锁类型:共享读锁(F_RDLCK)和独占写锁(F_WRLCK)。作为建议性锁,其有效性依赖所有进程自觉遵守。主要特点包括:支持字节范围锁定、阻塞/非阻塞模式(F_SETLKW/F_SETLK)、随文件描述符关闭自动解锁。相比flock(),fcntl()更灵活(POSIX标准),能锁定文件部分区域。使用时需注意:锁基于进程+文件描述符,跨进程才互斥;建议形成"加锁-操作-解锁"的明确闭环逻辑。(1原创 2025-06-23 11:31:10 · 25 阅读 · 0 评论 -
C接口-详解 lstat()
摘要:lstat()是Unix/Linux系统中获取文件信息但不跟随符号链接的系统调用。与stat()不同,它只返回符号链接本身的信息(如类型、权限、链接路径长度等),而非链接指向的目标文件信息。通过struct stat结构体可获取详细信息,使用S_ISLNK宏判断文件是否为符号链接。lstat()在需要区分链接与目标(如目录遍历、备份工具开发)时特别有用,且不会因目标文件不存在而报错。典型应用场景包括实现ls命令、构建安全工具等。该调用需配合readlink()获取链接指向的实际路径。原创 2025-06-23 10:24:55 · 22 阅读 · 0 评论 -
C接口-详解 fstat()
摘要:fstat()函数通过已打开的文件描述符获取文件状态信息,保存在stat结构体中。与stat()不同,fstat()直接操作文件描述符,避免了路径相关的错误。结构体包含文件大小、权限、时间戳等元数据。典型应用包括:获取文件属性、判断文件类型(使用S_ISxxx宏)、在服务端处理客户端文件描述符等。函数成功返回0,失败返回-1并设置errno。fstat()是系统编程中安全获取文件元数据的重要方法,尤其适用于需要处理已打开文件的场景。原创 2025-06-23 09:41:45 · 49 阅读 · 0 评论 -
经典Linux编程-如何实现守护进程
摘要:本文详细解析了将前台进程守护化的典型实现代码dodaemonize()。该函数通过以下步骤实现守护进程:1)通过fork创建子进程并退出父进程;2)调用setsid创建新会话;3)切换工作目录;4)关闭终端相关文件描述符;5)重定向标准I/O到/dev/null。文章还解释了文件描述符关闭的安全性,并提供了一个TCP守护进程的实践示例,包括systemd服务配置。这种规范化的守护进程流程广泛应用于后台服务程序中。原创 2025-06-18 18:05:32 · 29 阅读 · 0 评论 -
详解C 插件设计思想
插件设计= 核心系统 + 插件接口(规范)+ 动态加载实现} Plugin;} Plugin;#endif优点说明模块化/插件化各认证方式独立实现,互不影响灵活切换只需注册不同的实例条件编译适配多环境#ifdef控制支持的认证方式清晰职责分离parse负责初始化,check负责验证,exit负责释放资源增强扩展性添加新的认证方式只需实现三个函数,注册到auth_list即可。原创 2025-06-14 17:10:14 · 36 阅读 · 0 评论 -
C经典的 安全 I/O 封装函数safe_write() 和 safe_read()
机制/思想描述EINTR 处理系统调用可能被信号中断,要continue重试非阻塞模式下使用poll()限时等待资源就绪写入/读取完整性确保所有数据都写入/读取,提升可靠性抽象封装封装底层细节,提高上层代码可维护性I/O 资源保护如果poll()超时失败,设置ETIMEDOUT明确告知。原创 2025-06-14 15:13:34 · 28 阅读 · 0 评论 -
C设计理念:一个用于构造和发送客户端响应的缓冲区输出机制
摘要:本文分析了一个用于客户端响应的缓冲区输出机制源码,该机制通过缓冲优化服务器发送文本协议的性能和可靠性。核心组件包括缓冲区初始化、刷新缓冲和格式化输出三个函数,设计上降低了系统调用频率,提高了吞吐量,并严格检查边界防止溢出。文章还讨论了该设计在多线程环境下的锁机制建议,并举例说明了实际调用接口的使用方式。该缓冲输出机制体现了性能与正确性的平衡,适用于网络服务等场景。原创 2025-06-14 14:46:03 · 154 阅读 · 0 评论 -
详解 c 中的strtoul函数
C语言strtoul函数提供了字符串到无符号长整型的转换功能,支持2-36进制及自动识别(base=0)。函数原型在<stdlib.h>中,参数包括输入字符串、转换终止指针和进制基数。它会跳过前导空白,返回转换结果或0(失败时),溢出时设置errno=ERANGE。典型用途包括命令行参数处理、安全读取配置文件及多种进制格式的数字解析。示例展示了如何正确使用该函数进行16进制转换并检测溢出情况。原创 2025-06-14 10:58:15 · 67 阅读 · 0 评论 -
C 中经典的变参函数格式化字符串固定写法-日志函数举例
va_list ap;va_end(ap);这四行是固定写法功能相似,但更灵活,可用于不定参数数量的函数。log_msg// 获取可变参数// 打印带时间戳和等级的日志// 去掉结尾的换行符return 0;输出。原创 2025-06-14 09:58:17 · 19 阅读 · 0 评论 -
strncpy, memcpy,strdup,snprintf 使用推荐,如何安全封装?
摘要:本文对比了C语言中四种常用复制函数(strncpy、memcpy、strdup、snprintf)的使用场景与安全特性。strncpy适用于字符串复制但需手动加终止符;memcpy用于二进制数据复制但需注意内存不重叠;strdup自动分配内存复制字符串;snprintf最推荐用于格式化输出。文中还提供了一个轻量级安全字符串处理库实现,包含安全复制、拼接、去空格等功能,适用于嵌入式开发和安全编码。该库完全兼容标准C,无需第三方依赖,强调边界控制和溢出防护。原创 2025-06-13 16:39:09 · 39 阅读 · 0 评论 -
c 的getpwnam() 函数详解
摘要:getpwnam()函数用于通过用户名查询系统用户信息,返回包含UID、家目录等详细数据的passwd结构体指针。典型应用场景包括:1) 获取特定用户配置信息;2) 服务程序切换用户身份(如FTP服务查找"ftp"用户获取其UID)。使用时需注意:该函数非线程安全,推荐使用getpwnam_r()替代;密码字段实际为空;返回指针指向静态内存不可释放。示例演示了查找"root"用户信息的过程,特别说明某些服务(如Pure-FTPd)会尝试查找"ftp&q原创 2025-06-13 15:59:11 · 41 阅读 · 0 评论 -
详解C 语言中的 getopt 以及参数 optarg
名称说明optarggetopt()提供的选项参数字符串指针自动声明不需要你显式定义,由头文件声明,链接时由系统提供用法仅当选项定义中带(如"S:")时才会填充。本文介绍了getopt工具的两种主要用法:在C程序中解析命令行参数和在shell脚本中处理选项。在C语言中,通过unistd.h的getopt()函数或getopt.h的getopt_long()函数解析短/长选项;在Bash脚本中则使用GNU的getopt命令。文章提供了两种场景的代码示例,展示了如何定义和解析带参数和不带参数的选项。getopt原创 2025-06-13 15:01:27 · 26 阅读 · 0 评论 -
C 信号处理典型用法
摘要:本文解析了Linux进程信号处理的实现机制,重点介绍了set_signals()函数如何配置进程对不同信号的响应方式。该函数通过sigaction设置信号处理策略,包括:1)自定义处理SIGCHLD/SIGTERM等关键信号;2)忽略SIGPIPE等干扰信号;3)通过sigprocmask屏蔽未处理的信号。文中详细说明了信号处理函数sigchild()如何优雅回收子进程资源,以及sigterm()如何实现服务平滑终止。这些机制是构建高可靠性守护进程和服务程序的基础,能有效防止僵尸进程、资源泄露等问题,原创 2025-06-12 19:36:12 · 226 阅读 · 0 评论 -
C 如何将当前进程的时区初始化并标准化?或者怎么时间统一为 UTC
《系统时区初始化函数init_tz()解析》摘要:该函数用于标准化系统时区环境变量TZ,确保localtime()等时间函数行为一致,适用于网络程序和嵌入式系统。主要流程包括:调用tzset()初始化时区、获取当前时间并转换、通过strftime提取时区偏移、构建POSIX格式TZ变量(如"TZ=UTC-08:00")、用putenv设置全局环境,最后触发时间函数缓存更新。该技术特别适用于需要固定UTC基准的嵌入式系统、网络协议实现和跨平台代码,但需注意putenv仅影响当前进程,且%z原创 2025-06-12 15:12:14 · 150 阅读 · 0 评论 -
交换机嵌入式 Linux 系统中的动态链接库
本文介绍了Linux系统中的.so共享对象文件(类似Windows的.dll)。.so文件分为标准库、驱动适配库、业务功能库等类型,存储在/usr/lib目录,具有模块化、内存共享和平台抽象的优势。它们通过动态链接在程序运行时加载,如CLI命令执行时会链式调用多个.so库(解析→业务→驱动)。这种机制实现了功能模块热更新、多进程共享和跨平台支持,是嵌入式系统的重要设计特点。原创 2025-06-12 14:14:13 · 70 阅读 · 0 评论 -
面向交换机系统的 Pure-FTPd 集成指南
嵌入式交换机运行一个基于 Linux 的定制操作系统(如 Buildroot、Yocto、自研 Linux)系统通常由如下模块构成:内核(Linux Kernel)根文件系统(RootFS)Bootloader(如 U-Boot)自研系统守护进程和网络协议栈第三方组件(如 FTP、SSH、WebUI)步骤动作①拷贝源码至②使用configure和交叉编译生成pure-ftpd③在Makefile中加入install规则,打入 image④编写 CLI 接口控制 FTP 启动/停止。原创 2025-06-12 14:09:22 · 34 阅读 · 0 评论 -
怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)
摘要:对象池是一种高效管理资源的设计模式,通过预分配对象数组(operEntryTbl[])实现。系统包含四个核心组件:空闲链表(operFreeTbl)初始包含所有对象,使用中的对象存入AVL树(operUsedTbl)实现O(logN)检索,待更新对象加入队列(operUpdateTbl)。对象生命周期包含:分配时从空闲链表移除并插入AVL树,修改时加入更新队列,回收时返回空闲链表。这种模式适用于VRRP、网络连接池等高并发场景,有效减少内存分配开销和碎片,实现资源复用。关键优势在于通过组件分工实现高效原创 2025-06-09 19:24:28 · 105 阅读 · 0 评论 -
开发一个配置文件模块比较功能(附带源码)
增加show running-config compare命令来确认当前配置与start-config的区别原创 2025-06-03 20:04:36 · 31 阅读 · 0 评论 -
怎么开发一个网络协议模块(C语言框架)之(五) ——通用对象池 + 活跃集管理模式
这段代码展示了VRRP协议实现中的内存管理机制:使用calloc预分配对象池(operEntryTbl数组)来避免运行时频繁内存分配,通过三种数据结构协同管理——空闲链表(operFreeTbl)维护可用对象,AVL树(operUsedTbl)提供高效查找(O(logn)),更新链表(operUpdateTbl)处理状态变更。设计采用双重索引(链表+AVL)兼顾遍历和查询效率,初始化时所有对象加入空闲链表,使用时通过节点转移实现动态复用。关键点包括:比较函数需保证AVL键值唯一性、操作需线程安全、需规范释放原创 2025-05-28 23:03:24 · 45 阅读 · 0 评论 -
链表的初始化和节点的管理
这段代码展示了Linux内核中双向循环链表的初始化过程。通过调用list_add()函数,将预分配的gVrrpInstance.operEntryTbl数组中的所有节点依次插入到operFreeTbl空闲链表中,形成头插方式构建的循环链表结构。该模式常用于对象池管理,实现资源的高效复用,特别适用于VRRP等高可用协议中的状态表管理。最终形成的链表以operFreeTbl为头节点,按逆序连接所有操作表节点,构成完整的双向循环结构。原创 2025-05-28 22:48:02 · 41 阅读 · 0 评论 -
画图解释avl_create() 中使用 offsetof()
在中使用是为了告诉 AVL 树:每个元素中,哪个字段(偏移量)用作树节点的连接结构。这句的作用是:计算MEMBER字段在TYPE类型中从结构体起始地址开始的偏移量(以字节为单位)。假设node是结构体的第32个字节起始位置,那么这个宏就返回32。结构体插树有技巧,node字段做记号;offsetof偏移量,告诉AVL它在哪。原创 2025-05-28 19:46:20 · 114 阅读 · 0 评论 -
avl_create() 函数深度解析
AVL树通用容器实现的核心是:通过结构体大小和节点偏移量实现泛型管理。主要包含avl_tree_t(存储树元信息)和嵌入用户结构体的avl_node_t节点。其设计理念类似Linux内核的list_head,利用offsetof计算内嵌节点偏移量,配合比较函数实现类型安全的通用数据结构。这种纯C实现方式无需模板/继承机制,通过void*和偏移量访问即可管理任意包含AVL节点的自定义结构体,体现了高效的内核级容器化设计思想。原创 2025-05-25 22:13:01 · 37 阅读 · 0 评论 -
AVL树最详细图示讲解(含 C 伪代码)
AVL树是一种自平衡二叉搜索树,通过旋转操作保持左右子树高度差不超过1。本文详细解析了AVL树的四种旋转情况(LL、RR、LR、RL)及其处理方式,并提供了C语言风格的伪代码实现,包括节点插入和删除操作。插入和删除时需要更新高度并检查平衡因子,必要时进行旋转以恢复平衡。AVL树保证了O(logn)的时间复杂度,适合需要频繁插入、查找的场景,常用于数据库索引等对性能要求较高的应用中。文中通过具体示例和图解,直观展示了AVL树的平衡维护机制。原创 2025-05-25 17:04:15 · 51 阅读 · 0 评论 -
图示讲解二叉搜索树的中序遍历代码
本文演示了二叉树的中序遍历递归过程。以AVL树(20,10,30,25)为例,中序遍历顺序为左-根-右,预期输出10 20 25 30。通过递归代码分析,详细追踪了函数调用栈的执行步骤:先递归访问左子树到底部,打印节点后转向右子树。最终输出验证了遍历的正确性,并图示了递归调用的压栈与回溯过程,展示了深度优先搜索的特性。原创 2025-05-25 16:24:50 · 34 阅读 · 0 评论 -
为什么 inet_ntop的 size 不用减 1
不需要-1;会自动处理\0;使用结论说明❌ 不要用会导致误传 buffer 长度,尤其 IPv6 时容易截断✅ 用传入函数会保证不会越界写入✅ 自动加 '\0'所以 buffer 长度要大于等于最大地址字符串长度如你需要兼容 IPv4 和 IPv6,推荐(长度为 46 字节)是最安全的选择。原创 2025-05-23 09:15:21 · 45 阅读 · 0 评论 -
semTake 函数详解(VxWorks API)
如果该信号量可用,则立即获得;配合使用,确保正确管理信号量的状态。,如果不可用,可以等待或超时返回。来代替 VxWorks 的。原创 2025-03-17 10:57:11 · 194 阅读 · 0 评论 -
Linux 环境下,类似VxWorks 的互斥信号量机制
环境下,很多 VxWorks 迁移过来的代码仍然会使用类似的互斥信号量机制。不过,Linux 本身不直接提供。VxWorks 互斥信号量 (,在 Linux 中可以用。提供的 API,但在。),虽然它不完全等同于。原创 2025-03-17 10:46:44 · 102 阅读 · 0 评论 -
semMCreate() 函数原型详解
是 VxWorks 实时操作系统 (RTOS) 提供的。选项,防止低优先级任务持有锁而高优先级任务被阻塞的问题。:持有信号量的任务不能在持有状态下再次。,否则会导致其他任务永久阻塞。,用于任务间同步和资源保护。原创 2025-03-17 10:41:33 · 120 阅读 · 0 评论