dlz0836
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
从架构到数据结构,到同步逻辑,到 show run 流程优化
查询操作配置实时同步,保证一致性大规模设备也不再卡顿。原创 2025-11-25 13:57:15 · 248 阅读 · 0 评论 -
工作笔记-处理时间的常用数据类型总结
time_t是最简单的时间类型,主要用于表示自 UNIX 纪元以来的秒数。提供了更高精度的时间表示,精确到纳秒,适用于高精度时间测量。struct tm用于表示具体的日期和时间,它提供了年、月、日、时、分、秒等字段,适用于处理和转换日期/时间。这些结构体和类型是 C 语言处理中时间的基本工具,选择使用哪个取决于你的精度要求和应用场景。原创 2024-12-04 17:39:03 · 474 阅读 · 0 评论 -
笔记-pcap_open_live
是一个用于捕获和分析网络数据包的库,常用于网络监控和调试工具,如 Wireshark 或 tcpdump。通过这个函数,可以捕获实时网络数据包,进行分析或者处理。它用于打开网络设备进行数据包捕获。原创 2024-12-03 00:02:37 · 639 阅读 · 0 评论 -
工作笔记-常见的 setsockopt 选项
用途:返回套接字的最后一个错误。这个选项在异步 I/O 或非阻塞套接字中非常有用,可以用来检测错误。场景:调试网络问题或异常处理。int err;setsockopt提供了大量的选项,可以帮助你控制和优化网络应用程序的行为。不同的选项适用于不同的应用场景,因此了解每个选项的具体用途对于编写高效、可靠的网络应用至关重要。常见的选项包括调整缓冲区大小、启用 TCP keepalive、禁用 Nagle 算法、控制超时和多播等。选择合适的选项可以提升应用的性能、稳定性和可用性。原创 2024-12-02 09:08:33 · 158 阅读 · 0 评论 -
工作笔记-结构体FILE
FILE是一个由标准库定义的结构体,它并不直接暴露其内部实现,开发者无法看到结构体的具体内容。FILE的主要作用是作为文件操作函数的参数和返回值,用于标识一个文件流,并维护文件流的状态。在 C 标准库中,FILE是定义在头文件中的。通常,我们不需要关心FILE结构体的内部细节,只需要使用它来处理文件操作。FILE是一个用于表示文件流的结构体,定义了与文件交互时所需的信息,如文件描述符、缓冲区等。通过fopen打开文件,返回一个FILE*原创 2024-12-01 16:39:06 · 979 阅读 · 0 评论 -
C接口-详解 lstat()
摘要:lstat()是Unix/Linux系统中获取文件信息但不跟随符号链接的系统调用。与stat()不同,它只返回符号链接本身的信息(如类型、权限、链接路径长度等),而非链接指向的目标文件信息。通过struct stat结构体可获取详细信息,使用S_ISLNK宏判断文件是否为符号链接。lstat()在需要区分链接与目标(如目录遍历、备份工具开发)时特别有用,且不会因目标文件不存在而报错。典型应用场景包括实现ls命令、构建安全工具等。该调用需配合readlink()获取链接指向的实际路径。原创 2025-06-23 10:24:55 · 56 阅读 · 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 · 48 阅读 · 0 评论 -
工作笔记-宏中的字符串# 操作符与## 操作符
/ 输出 "Hello, World!return 0;在这个例子中,MESSAGE是一个宏,表示字符串。当程序编译时,MESSAGE会被替换为这个字符串常量。宏中的字符串:通过宏,我们可以将常用的字符串作为常量定义,并且通过条件编译等方式生成不同的字符串。操作符:将宏参数转换为字符串常量,可以用于创建动态字符串。##操作符:用于拼接字符串常量或宏参数,可以用来生成新的字符串或变量名。条件编译:宏中的字符串也可以结合条件编译,方便地根据编译时的条件选择不同的字符串输出。原创 2024-12-01 16:17:48 · 622 阅读 · 0 评论 -
工作笔记-pthread_create
用于创建一个新线程,执行指定的线程函数。线程函数必须返回void*类型,并且接受一个void*类型的参数。通过pthread_t来标识线程,用来等待线程结束。使用可以设置线程的属性,比如栈大小、调度策略等。创建线程时,需要注意错误处理,确保系统资源足够支持创建新线程。如果你的系统支持 POSIX 线程(大多数类 Unix 系统支持),并且在编译时正确链接了pthread库,你就能使用等线程功能。原创 2024-12-16 17:38:17 · 94 阅读 · 0 评论 -
C 中经典的变参函数格式化字符串固定写法-日志函数举例
va_list ap;va_end(ap);这四行是固定写法功能相似,但更灵活,可用于不定参数数量的函数。log_msg// 获取可变参数// 打印带时间戳和等级的日志// 去掉结尾的换行符return 0;输出。原创 2025-06-14 09:58:17 · 36 阅读 · 0 评论 -
avl_create() 函数深度解析
AVL树通用容器实现的核心是:通过结构体大小和节点偏移量实现泛型管理。主要包含avl_tree_t(存储树元信息)和嵌入用户结构体的avl_node_t节点。其设计理念类似Linux内核的list_head,利用offsetof计算内嵌节点偏移量,配合比较函数实现类型安全的通用数据结构。这种纯C实现方式无需模板/继承机制,通过void*和偏移量访问即可管理任意包含AVL节点的自定义结构体,体现了高效的内核级容器化设计思想。原创 2025-05-25 22:13:01 · 71 阅读 · 0 评论 -
c 的getpwnam() 函数详解
摘要:getpwnam()函数用于通过用户名查询系统用户信息,返回包含UID、家目录等详细数据的passwd结构体指针。典型应用场景包括:1) 获取特定用户配置信息;2) 服务程序切换用户身份(如FTP服务查找"ftp"用户获取其UID)。使用时需注意:该函数非线程安全,推荐使用getpwnam_r()替代;密码字段实际为空;返回指针指向静态内存不可释放。示例演示了查找"root"用户信息的过程,特别说明某些服务(如Pure-FTPd)会尝试查找"ftp&q原创 2025-06-13 15:59:11 · 111 阅读 · 0 评论 -
工作笔记-select
select是一种多路复用技术,适用于监听多个文件描述符的 I/O 事件。它的应用广泛,尤其在需要同时处理多个网络连接时非常有用。然而,对于大规模的并发连接,select的性能有限,可以考虑使用poll或epoll等更高效的替代方案。原创 2024-12-03 09:39:01 · 808 阅读 · 0 评论 -
工作笔记-struct in_addr 之类的结构体汇总(二)
这些额外的结构体在高级网络编程中非常有用,帮助处理更复杂的场景。包括用于 Unix 域套接字通信()、多路复用()、TCP 连接状态查询()、进程间通信()等操作。熟练掌握这些结构体和它们的用途,可以我们能够更灵活地进行网络编程,并解决更复杂的网络问题。结构体用途关键字段常见用法表示 IPv4 地址s_addr:32 位 IPv4 地址与inet_pton和inet_ntoa配合使用,进行 IPv4 地址的转换表示 IPv4 地址和端口sin_family:地址族;sin_port:端口;原创 2024-12-04 09:12:53 · 202 阅读 · 0 评论 -
工作笔记-pthread_join
用于等待一个线程结束,并获取其返回值。它是实现线程同步的关键函数,确保线程之间的正确执行顺序。可以获取线程的返回值,或者忽略返回值(传递NULL使用时,要避免死锁(如等待自己或者多个线程相互等待),并且确保线程资源得到正确回收。原创 2024-12-16 17:57:38 · 246 阅读 · 0 评论 -
详解 c 中的strtoul函数
C语言strtoul函数提供了字符串到无符号长整型的转换功能,支持2-36进制及自动识别(base=0)。函数原型在<stdlib.h>中,参数包括输入字符串、转换终止指针和进制基数。它会跳过前导空白,返回转换结果或0(失败时),溢出时设置errno=ERANGE。典型用途包括命令行参数处理、安全读取配置文件及多种进制格式的数字解析。示例展示了如何正确使用该函数进行16进制转换并检测溢出情况。原创 2025-06-14 10:58:15 · 233 阅读 · 0 评论 -
详解struct ifreq ifr
以下是// 接口名称,如 "eth0" 或 "wlan0"union {// 用于存储地址// 用于存储硬件地址(MAC 地址)// 网络接口标志// 接口索引// 硬件映射,通常用于设置设备// 指定接口度量// 接口的最大传输单元// 接口配置,通常用于获取接口列表是一个多用途的数据结构,用于存储和操作网络接口的配置信息。它在使用ioctl系统调用时尤其重要,因为ioctl是与网络接口(如获取 IP 地址、MAC 地址、接口标志等)交互的一种常见方式。通过ifreq。原创 2024-11-30 11:12:38 · 1376 阅读 · 0 评论 -
工作笔记-fgets函数
fgets是用于读取一行字符的函数,可以从标准输入流或文件流中读取数据。fgets会保留行尾的换行符,若不需要换行符,通常需要手动去除。fgets的好处是能够控制读取的字符数,避免了gets的安全问题。使用fgets处理文件或用户输入时需要注意缓冲区的大小,避免出现溢出错误。通过fgets,我们能够安全、有效地从文件或标准输入读取数据,是 C 语言中非常重要的输入函数之一。原创 2024-12-01 19:44:42 · 1316 阅读 · 0 评论 -
strncpy, memcpy,strdup,snprintf 使用推荐,如何安全封装?
摘要:本文对比了C语言中四种常用复制函数(strncpy、memcpy、strdup、snprintf)的使用场景与安全特性。strncpy适用于字符串复制但需手动加终止符;memcpy用于二进制数据复制但需注意内存不重叠;strdup自动分配内存复制字符串;snprintf最推荐用于格式化输出。文中还提供了一个轻量级安全字符串处理库实现,包含安全复制、拼接、去空格等功能,适用于嵌入式开发和安全编码。该库完全兼容标准C,无需第三方依赖,强调边界控制和溢出防护。原创 2025-06-13 16:39:09 · 157 阅读 · 0 评论 -
详解kmalloc和kfree
kmalloc用于分配内核空间的物理连续内存,kfree用于释放这些内存。kmalloc需要提供分配大小和分配标志,而kfree只需要提供待释放的内存指针。原创 2024-12-01 15:41:44 · 674 阅读 · 0 评论 -
工作笔记-信号量(一)
信号量本身并没有明确的“同步”或“通信”之分,它可以在不同的场景下发挥不同的作用,具体取决于使用场景和设计意图。:信号量可以用来控制并发线程或进程的执行顺序,保证它们按照特定的顺序执行,以避免竞争条件。假设我们有两个线程,线程 A 先执行操作 1,线程 B 执行操作 2,我们需要确保线程 A 在线程 B 之前执行完操作 1。线程可以使用信号量来通知其他线程某个事件的发生,或者表示某个条件的满足。假设线程 A 和线程 B 共享一个资源,线程 A 在资源准备好之后通知线程 B,线程 B 再开始使用该资源。原创 2024-12-13 09:27:39 · 93 阅读 · 0 评论 -
工作笔记-信号量(三)
信号量在多线程或多进程环境下,除了用于。原创 2024-12-13 10:06:34 · 87 阅读 · 0 评论 -
C 多进程服务器中安全地更新全局变量(增加子进程计数)
本文介绍了在多进程服务器编程中如何安全处理SIGCHLD信号和子进程计数。主要内容包括:通过sigemptyset()初始化信号集,sigaddset()添加SIGCHLD信号,并使用sigprocmask()暂时阻塞该信号,确保在修改子进程计数变量(nb_children++)时不会被信号处理程序中断。这种方法解决了主程序修改计数时可能因收到SIGCHLD信号而导致的竞态问题。文章还解释了为何在多进程而非多线程环境下选择信号屏蔽而非互斥锁来保证数据一致性。这些技术是Unix多进程编程中管理信号敏感区和进程原创 2025-06-23 19:28:14 · 31 阅读 · 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 · 193 阅读 · 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 · 57 阅读 · 0 评论 -
工作笔记-信号量(二)
信号量(Semaphore)是一种用来管理对共享资源访问的同步工具,它是一种计数器,用来控制多个线程或进程对资源的访问。原创 2024-12-13 09:58:10 · 120 阅读 · 0 评论 -
工作笔记-sem_init
sem_init是一个用于初始化信号量的函数,适用于线程间同步。它是 POSIX 标准的一部分,并广泛用于多线程编程中。确保正确设置信号量的初值和共享方式,以便在不同场景下有效地同步线程或进程。初始化一个值为 0 的信号量,通常用于线程间同步。使用信号量值为 0 的初始化,线程会在调用sem_wait时被阻塞,直到另一个线程通过sem_post调用释放信号量。原创 2024-12-16 16:48:12 · 327 阅读 · 0 评论 -
工作笔记-信号量(四)
并发线程或进程访问共享资源的机制,二者有一定的相似性,但本质上有显著的区别。为了理解信号量与互斥锁的关系,我们可以从多个角度来进行比较和分析。信号量比互斥锁更具灵活性,但互斥锁在实际应用中往往是最常用的同步工具,因为它简单而高效,特别是在保护共享资源时。信号量(Semaphore)和互斥锁(Mutex)都是用于。尽管它们有共同的目标和功能,但它们的。原创 2024-12-13 10:42:04 · 84 阅读 · 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 · 44 阅读 · 0 评论 -
fcntl() 文件锁的用法与它在进程间同步中的作用
摘要:文件锁(fcntl())用于解决多进程/线程并发访问共享文件时的数据竞争问题,提供两种锁类型:共享读锁(F_RDLCK)和独占写锁(F_WRLCK)。作为建议性锁,其有效性依赖所有进程自觉遵守。主要特点包括:支持字节范围锁定、阻塞/非阻塞模式(F_SETLKW/F_SETLK)、随文件描述符关闭自动解锁。相比flock(),fcntl()更灵活(POSIX标准),能锁定文件部分区域。使用时需注意:锁基于进程+文件描述符,跨进程才互斥;建议形成"加锁-操作-解锁"的明确闭环逻辑。(1原创 2025-06-23 11:31:10 · 55 阅读 · 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 · 43 阅读 · 0 评论 -
C经典的 安全 I/O 封装函数safe_write() 和 safe_read()
机制/思想描述EINTR 处理系统调用可能被信号中断,要continue重试非阻塞模式下使用poll()限时等待资源就绪写入/读取完整性确保所有数据都写入/读取,提升可靠性抽象封装封装底层细节,提高上层代码可维护性I/O 资源保护如果poll()超时失败,设置ETIMEDOUT明确告知。原创 2025-06-14 15:13:34 · 74 阅读 · 0 评论 -
C接口-详解 fstat()
摘要:fstat()函数通过已打开的文件描述符获取文件状态信息,保存在stat结构体中。与stat()不同,fstat()直接操作文件描述符,避免了路径相关的错误。结构体包含文件大小、权限、时间戳等元数据。典型应用包括:获取文件属性、判断文件类型(使用S_ISxxx宏)、在服务端处理客户端文件描述符等。函数成功返回0,失败返回-1并设置errno。fstat()是系统编程中安全获取文件元数据的重要方法,尤其适用于需要处理已打开文件的场景。原创 2025-06-23 09:41:45 · 152 阅读 · 0 评论 -
工作笔记-宏offsetof
type是结构体的类型。member是结构体中某个成员的名字。的结果是member成员相对于结构体开始位置的字节偏移量。整个表达式的作用就是通过空指针访问结构体成员,利用指针访问操作符->和获取成员相对于结构体起始位置的偏移量,并将其转换为size_t类型。原创 2024-12-01 20:02:12 · 581 阅读 · 0 评论 -
工作笔记-IP 地址转换相关的函数对比总结
函数功能支持地址类型输入格式输出格式inet_ntoa将转换为 IPv4 字符串IPv4(二进制)字符串(点分十进制)inet_aton将 IPv4 字符串转换为IPv4点分十进制字符串(二进制)inet_ntop将转换为字符串(二进制)字符串(点分十进制 / IPv6)inet_pton将 IPv4 / IPv6 字符串转换为点分十进制 / IPv6 字符串(二进制)原创 2024-12-03 13:52:51 · 451 阅读 · 0 评论 -
工作笔记-struct in_addr 之类的结构体汇总(一)
网络编程中,常用的结构体主要包括用于表示 IP 地址、端口、协议族等信息的结构体。:用于表示 IPv4 地址。:用于表示 IPv4 地址和端口。:用于表示 IPv6 地址和端口。:通用套接字地址结构。:用于表示 IPv6 地址。:用于网络接口相关的请求。:用于存储不同协议族的地址。:用于地址信息获取和解析。这些结构体和相关函数帮助我们处理网络编程中的地址、端口和协议相关的操作,确保数据正确地通过网络传输。原创 2024-12-03 22:55:03 · 1105 阅读 · 0 评论 -
工作笔记-系统调用
操作系统内核运行在特权模式(Ring 0),而用户程序运行在用户模式(Ring 3)。为了确保系统的安全性和稳定性,用户程序无法直接访问硬件资源或执行特权操作。系统调用正是用户程序与内核交互的一种机制,通过它,用户程序能够请求操作系统提供特定的服务,如打开文件、创建进程、分配内存等。系统调用是操作系统提供给用户程序的接口,用户通过系统调用请求操作系统执行一些特权操作。了解系统调用的原理和常见类型,能帮助我们更高效地编写程序,特别是在需要直接与操作系统底层交互的场景中。原创 2024-12-04 12:46:43 · 573 阅读 · 0 评论 -
typedef 的用法总结
这些高级用法展示了typedef的强大和灵活性,能够使代码更加模块化、可维护并增强类型安全。你可以通过typedef为复杂的类型、结构体、函数指针、数组和指针定义别名,简化代码。提供类型安全,避免类型错误。与#define、条件编译等结合使用,实现更复杂的类型定义。原创 2024-12-01 13:17:15 · 646 阅读 · 0 评论 -
工作笔记- 字节顺序转换函数对比总结
函数功能处理的类型字节顺序转换htonl主机字节顺序转网络字节顺序(32 位)uint32_t主机(主机字节顺序) → 网络(大端字节顺序)ntohl网络字节顺序转主机字节顺序(32 位)uint32_t网络(大端字节顺序) → 主机(主机字节顺序)htons主机字节顺序转网络字节顺序(16 位)uint16_t主机(主机字节顺序) → 网络(大端字节顺序)ntohs网络字节顺序转主机字节顺序(16 位)uint16_t网络(大端字节顺序) → 主机(主机字节顺序)原创 2024-12-03 20:35:29 · 831 阅读 · 0 评论 -
链表的初始化和节点的管理
这段代码展示了Linux内核中双向循环链表的初始化过程。通过调用list_add()函数,将预分配的gVrrpInstance.operEntryTbl数组中的所有节点依次插入到operFreeTbl空闲链表中,形成头插方式构建的循环链表结构。该模式常用于对象池管理,实现资源的高效复用,特别适用于VRRP等高可用协议中的状态表管理。最终形成的链表以operFreeTbl为头节点,按逆序连接所有操作表节点,构成完整的双向循环结构。原创 2025-05-28 22:48:02 · 94 阅读 · 0 评论
分享