hiredis & libev 非阻塞模式

背景是需要从redis订阅(subscribe)消息,并且希望可以随时终止该线程并正常释放资源,因此选择hiredis的异步(Asynchronous )模式(个人更喜欢称其为非阻塞模式,因为通过event loop主动检查并触发事件的方式个人认为应该看作为同步模式),并且选择libev做event loop,这里贴一下整理的使用代码。

阅读全文

libvirt nwfilter 简单使用

nwfilter(network filter)是libvirt中的网络数据包过滤子系统,用于过滤进出虚拟机的网络流量,仅支持qemu kvm虚拟机。本文主要记录官网文档中理解稍有困难的部分,其他更多详细信息参考官网文档 libvirt: Network Filters

阅读全文

libxml2 简单使用

libxml2是一个用于XML解析的开发工具包,提供C语言接口。这里简单记录使用libxml2进行XML数据生成、解析及使用XPath语法进行节点选取的基本操作。

阅读全文

virt-install 简单使用

virt-install是一个使用libvirt库创建虚拟机或容器的命令行工具,参数比较多,这里仅记录使用该工具创建虚拟机的简单参数。

阅读全文

Linux RCU 内核同步机制

RCU(Read, Copy, Update)是一组Linux内核API,实现了一种同步机制,允许多个读者与写者并发操作而不需要任何锁,这种同步机制可以用于保护通过指针进行访问的数据。RCU读者只有很低的额外成本,在典型服务器内核配置下甚至是0成本。如果可能有多个写者,写者之间需要使用其他同步机制。除了使用RCU API直接访问指针数据,更多的使用方式是封装RCU API使其用于链表访问。

阅读全文

Linux timer 内核软件定时器

Linux内核中提供有timer软件定时器,可配置精度为1/HZ。同时还提供有高精度软件定时器hrtimer。本文记录低精度软件定时器timer的使用及原理。

阅读全文

Linux generic netlink 自定义内核通信

前文说过将32个netlink协议号中未使用的号码用于自定义内核模块通信并不是一个好主意,更规范的做法是使用generic netlink的方式达成同样的目的。generic netlink是一种netlink协议,被设计为一个通用的协议,用于承载运行于其上的各种用户自定义协议。这里介绍generic netlink的使用方式及其实现原理。

阅读全文

graphviz(dot) file vim 缩进设置

graphviz是一个开源图形可视化软件,使用dot语言以文本形式描述图形,并提供工具将dot文件输出为图片。但如果使用vim编辑dot文件,可能会面临缩进格式错误的情况。主要原因是vim没有识别dot文件中port格式,而是默认按照label的方式缩进到行首。

阅读全文

Linux netlink socket 内核通信

Netlink用于内核与用户空间程序传输信息,同时也可用于用户进程间通信。它包含用户空间下基于socket的标准接口,以及用于内核模块的内核API。iproute2工具包使用该方式从用户空间与内核进行通信。这里介绍netlink的简单使用方式与其实现原理。

阅读全文

Linux kernel thread 内核线程

Linux中无论是用户态进程、线程,还是内核线程,在内核中都使用同样的结构task_struct,可以看出内核都是以任务这个概念对待这些不同名字的事物。至于为什么会有kernel thread或者说内核线程这个词,个人认为应该是因为所有内核线程共享内核空间资源,因此有线程之名。

阅读全文