
C/C++知识扩充
文章平均质量分 58
北冥的备忘录
善读者,玩索而有得焉,则终身用之,有不能尽者矣。
本博客是笔者的个人实践记录,文笔随意,严谨度一般,仅供参考,不喜勿喷
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【代码模板】如何通过netlink从内核态主动发送消息到用户态?(netlink_kernel_create、nlmsg_new、nlmsg_put、netlink_unicast)
本文通过一个简单的例子介绍了Netlink机制的使用,展示了内核态与用户态之间的异步通信。主要流程包括:内核态驱动注册Netlink用户自定义消息组,用户态程序通过写入字符设备将PID发送给内核态驱动,内核态使用Netlink单播或广播机制通知对应的PID,用户态收到消息后打印出来自内核的信息。内核态程序通过netlink_kernel_create创建Netlink套接字,并通过字符设备接收用户态的PID。用户态程序通过socket创建Netlink套接字,并通过ioctl触发内核态发送消息。最终,用户态原创 2025-05-18 00:13:20 · 955 阅读 · 0 评论 -
【微知】sourceinsight如何使用备份文件功能?(File -> Open backup file; Tools -> Comapre backup file)
本文记录了关于sourceinsight的backup file的使用方法。在日常开发中,可以根据这个来进行对比和打开时候的对比方式,比git看的更习惯。另外虽然AI时代各种高效工具百花齐放,但是历久弥新的sourceinsight还是有他独特的生命力,毕竟已经三十几年的产品了。把工具用趁手了效率好快很多。原创 2025-05-04 08:51:32 · 479 阅读 · 0 评论 -
【问题解决】编译用户态PCIe程序报错fatal error: pci/pci.h: No such file or directory如何处理?yum install pciutils-devel
本文记录因为系统未安装PCIe用户态编译工具造成用户态PCIe程序编译报错的处理方法。原创 2025-05-02 22:03:14 · 351 阅读 · 0 评论 -
【代码拾遗】linux内核中的typecheck(unsigned long, a) 作用?(做类型检测)
typecheck 函数是一个C语言利用编译器特性的技巧。对于C语言代码中如果指定类型和入参不一致,编译器就会告警。typecheck实现原理就是用指定类型T来定义一个临时变量A,然后用typeof获取入参变量的类型T’来定义临时变量B。然后取地址将B的地址赋值给A的地址,如果编译器报错,说明两个类型不一样T不等于T‘。利用此方法从而实现了一个C语言级别来检测变量类型的功能。原创 2025-05-01 10:17:07 · 308 阅读 · 0 评论 -
【工具】如何将一个脚本作为C语言的一个文件被include到新的C文件中然后执行?(C语言 array的方式)
本文这种方式有挺多挺好玩的模式,比如常见的一些工具,可以用它来把命令封装,比如需要输入的特殊参数,比如不想让别人看到的。有些时候,用C语言想包括一个文件到运行态,因为C语言是静态程序,并且include的关键值只支持C格式,如何做到将某个文件存在于C语言中。使用xxd命令,将二进制文件转化为C语言数组,然后C语言 include,然后动态的比如创建文件,然后执行文件。本文以一个C语言的例子,执行一个shell脚本,并且该脚本存在于C语言的bin文件中。SHELL_TMP_NAME是指定动态创建的地方。原创 2025-04-06 01:20:25 · 322 阅读 · 0 评论 -
【编码习惯】C语言用宏定义带来好处个一个简单例子?(避免遗漏修改)
用宏定义来替代字符串作为硬编码直接写在代码中是一个良好的习惯。本文简单写一下该方式的好处。希望对才学习C语言的同学一些帮助。原创 2025-04-06 00:18:19 · 242 阅读 · 0 评论 -
【代码模板】C语言如何用FILE接口写入文件内容?(fwrite(STR, 1, strlen(STR), fp))
这里第一个参数表示 写入的字符,第二个表示按照size方式写入流,平时用1,然后是指定写入的字符串长度,然后是句柄。注意这里wb表示 二进制方式打开,w表示截断。原创 2025-04-06 00:10:16 · 276 阅读 · 0 评论 -
【代码模板】如何用FILE操作符打开文件?fopen、fclose
这里wb表示 二进制方式打开,并且是覆盖写。关于权限部分参考兄弟篇。原创 2025-04-05 23:56:56 · 238 阅读 · 0 评论 -
【代码模板】C语言中fopen打开文件的12种权限?5个关键字?2类文件?(5个关键字rwa+b,b来区分是否二进制,+表示读写,wa不仅表示写表示操作模式)
在C语言里,fopen函数用于打开文件,它的第二个参数是模式字符串,规定了文件的打开方式。r表示读w表示写a表示追加方式打开,不存在会创建r+表示读写方式打开,不存在会报错w+表示读写方式打开,不存在会创建;存在会覆盖。a+表示读写方式打开,写入会追加w和a的区别在于a追加,w覆盖。r必须存在。如果不存在自动创建用w或者a。如果不想清空用a。带+表示读写都有。这里理解w的本质不是表示写,而是表示清空写。所以才有了+来表示读写,而不直接用rw。带b的是处理二进制文件。原创 2025-04-05 23:52:01 · 475 阅读 · 0 评论 -
【代码模板】C语言如何修改文件权限?读写执行权限对应值是多少?(chmod(“./a.out“, 0741);bit 2 1 0表示 读 写 执行)
0741中0是8进制,7是 0111, 4是0100, 1是0001权限三个位分别表示自己,所在组,其他然后每个位的值 有3个bit,bit2是read(对应值0100, 十进制是4),bit1是write(对应值010, 十进制是2),bit0是exec(对应值01, 十进制是1)。所以7表示对于用户而言 3个bit都为1,就是rwx;原创 2025-04-05 23:37:06 · 393 阅读 · 0 评论 -
【代码模板】判断C语言中文件是否存在?错误:‘F_OK’未声明如何处理?(access;#include “unistd.h“)
【代码】【微知】判断C语言中文件是否存在?错误:‘F_OK’未声明如何处理?(access;原创 2025-04-05 23:14:07 · 379 阅读 · 0 评论 -
【问题记录】C语言一个程序bug定位记录?(定义指针数组忘记[])
写了个小的程序,一直段错误。特此记录。原创 2025-04-05 23:07:30 · 249 阅读 · 0 评论 -
【问题记录】编译中遇到illegal storage class on function的原因?
在 C 语言里,有一些不合法或者不适合用于某些上下文的存储类说明符。原创 2025-04-03 08:20:23 · 263 阅读 · 0 评论 -
代码模板-C语言常用的errno的名字、值以及对应关系?转换字符串函数?(errno.h, strerror; errno -l; man errno)
errno.h是C 编程语言标准库中的头文件。它定义了使用符号errno (“错误号”的缩写)报告和检索错误情况的宏。经常需要用来在内核态用户态返回错误寻找,本文以供快速检索。原创 2025-01-02 23:08:30 · 697 阅读 · 0 评论 -
代码模板-Linux内核中代码流程如何sleep随机时间?(#include <linux/delay.h> usleep_range(1000, 2000))
linux内核提供了很多delay的技术,本文是第二篇使用usleep_range的方式,之前还提供过一种用completion的timeout机制实现的。usleep_range的机制可以提供一个随机delay的时间值。原创 2024-12-27 08:11:18 · 358 阅读 · 0 评论 -
微知-C语言如何指定弱符号?(#define WEAK __attribute__((weak)); WEAK int foo(void))
在C语言中,弱符号是一种特殊的符号,它可以被重定义,但在链接时,只会使用被重定义的符号。在某些情况下,我们需要在多个文件中定义相同的函数,但只使用其中一个函数。本文将介绍如何在C语言中实现弱符号。原创 2024-12-18 00:07:22 · 368 阅读 · 0 评论 -
微知-如何查看某个二进制可执行文件依赖的动态库?(ldd xxx.bin)
经常需要分析某个文件依赖的动态库,包括他的名字和所在路径。本介绍ldd查看依赖库和路径的方式。原创 2024-11-25 01:27:20 · 300 阅读 · 0 评论 -
微代码-C语言如何分配内存并自动清零?(calloc)
在C语言中,calloc 函数用于分配内存,并且会自动将所有位初始化为零。原创 2024-11-22 02:59:40 · 236 阅读 · 0 评论 -
【微码】Mellanox中的ib_device_ops是如何“分工实现,合作初始化”的?
从上面多个ib_set_device_ops可以看到,同一个dev的操作函数,会使用多个dev_ops进行set,并且set方式是设置方都定义自己的ib_dev_ops,并把自己支持的ib_dev_ops赋值,其他的为空不设置。通用Linux驱动大多采用类似file_ops的方式解耦驱动具体实现和驱动上层业务实现,但是在Mellanox中可能由于驱动模块的复杂性,涉及到多个子模块。my_set_device_ops(dev, modulea_ops)调用完就分工初始化一个完整的device_ops。原创 2024-10-19 08:15:30 · 284 阅读 · 0 评论 -
代码模板之-C语言如何优雅的定义事件和字符串解析?(index < ARRAY_SIZE(str_event) ? str_event[index] : “unknown“)
在平时项目开发中,经常需要将事件或者ID转化为字符串。本文根据Mellanox驱动代码中的ib_event介绍介绍一种比较优雅的定义,判断的方法以及可以未来直接使用的代码。它的核心有点在于可以定义跳空的事件,以及直接使用字符串数组下标判空和越界的方法。一般方法是定义事件类型和字符串,然后解析。一般判断方法是 if event < EVENT_START && event > EVENT_END, return “unknown”并且定义enum也需要指定start和end类似这种:该方法需要定义sta原创 2024-10-16 08:28:44 · 682 阅读 · 0 评论 -
【微记录】Makefile中wildcard(通配)的一种用法--如何避免某个头文件路径不存在造成CLFAGS添加后编译报错?
在Makefile中使用wildcard将路径剥离后查看是否为空,原创 2024-05-15 02:45:17 · 712 阅读 · 0 评论 -
【1000个GDB技巧之】如何在远端服务器打开通过vscode动态观测Linux内核实战篇?
(也可以直接在vscode中配置,忽略)主要步骤:在~/.ssh/config中添加服务端的host,以便vscode的remote中能够登录。原创 2024-04-14 10:22:58 · 1124 阅读 · 0 评论 -
kunit常用的20个判断宏(2真假、6大小、5指针、2字符串、2内存、2断言、2msg)
另外根据这个这些接口看Linux内核代码在5.x之后kunit修改挺多的。原创 2024-04-12 00:14:17 · 314 阅读 · 0 评论 -
Linux内核单元测试框架kunit的3个对象和N个函数和1个接口(kunit_suite, kunit_case[], func1(), struct kunit,kunit_run_tests)
这个kunit相当于是一个中间态的结构体,kunit内部每次执行前定义一个临时的kunit,然后进行执行。每次执行后,把结果更新到这个kunit中,并且使用的kunit的判断宏使用这个kunit里面的status根据判断结果存储进去。比如KUNIT_EXPECT_EQ(test, 1, 1),就会把OK的结果存入test的status中。这里相当于使用了结构化初始化,把所有需要运行的case,放到my_test_cases的数组中。然后执行完成后,把执行结果test存储到case的status中。原创 2024-04-11 23:39:52 · 1113 阅读 · 0 评论 -
常用的一些GCC参数的记录(不管更新)
经常需要配置各式各样的C语言的GCC参数,也老是忘记。特此归档记录在这里,以供未来取用。暂时只收集想到的用过的 更多以后更新和迭代。后文将以makefile中更新某个CLFAGS的方式记录。原创 2024-04-10 00:45:36 · 156 阅读 · 0 评论 -
C语言奇技淫巧之--用宏定义替换函数名的另外一种思路
比如内核有个kunit模块,然后我们自己实现了一个kunit接口类似的模块,如果内核加载了这个模块,自己的模块就需要都把函数替换一遍,优雅地做法就是上面的方式。上面的代码有点绕,要动态的来看,在编译预处理阶段将myfunc函数替换为_myfunc,那么通过-i参数假设看生成的预处理后的文件就会看到只有_myfunc,没有myfunc了。奇技淫巧的做法是,灵活利用C语言编译预处理,在预处理阶段就进行了替换,从而避免了某个函数各种名字的方式,不过这种类型仅限于微改变函数参数仅仅改变函数名字的场景。原创 2024-04-10 00:23:38 · 1614 阅读 · 1 评论 -
再谈Makefile和C的2种变量和3个空间和2种if的工程实践中的常见用法的模板?env CONFIG_FEATURE_A=n make、ifeq ($(CONFIG_FEATURE_A), y)
提笔简要记录方法。原创 2024-04-09 23:50:25 · 373 阅读 · 1 评论 -
C语言奇技淫巧之--“函数指针数组”的类型定义与结构化初始化某一个函数
错(这种定义方式可以定义非函数类型)# 对(函数类型的类型名直接就是在(*)里面enum {//注意一般是使用多个func,比如linux内核,但是很少用函数指针数组,尤其是还包括结构化初始化。原创 2024-04-09 23:33:33 · 499 阅读 · 0 评论 -
Makefile命令行指定参数传递到C语言文件的4个步骤、2类关键字和2种变量
使用在 命令参数,比如 echo 参数,GCC 参数使用在定义条件分支,比如 ifeq linux 或者 mac使用在定义 relase 或者 debug 发布使用在定义 C 语言cflags有某个功能宏定义开关,C语言根据场景判断是否有这种功能代码进行预编译区分(优势是能够节省代码段)核心:make ifeq 与 else ifeqc ifdef 与 else ifdef。并且ifdef = if defined。原创 2024-03-28 08:42:58 · 1931 阅读 · 0 评论 -
GDB 快速使用调试测试 C 程序的3个步骤
所以核心是 gdb直接启动后,r执行程序 crash后使用bt查看程序所在行。更多高阶用法以后更新。原创 2024-03-16 00:40:50 · 797 阅读 · 0 评论 -
一个 C 语言中使用 # 的工程实践,直接将文本字符转义成C语言字符
在工程初期,某个回调函数还没有被实现,但是希望在能够打印出来。原创 2024-03-16 00:26:53 · 425 阅读 · 0 评论 -
【微知识】Makefile 如何执行 shell 代码?$(shell xxx)
然后就可以用类似的 其他文档中提到的将src进行编译的方式进行编译。原创 2024-03-15 23:43:15 · 406 阅读 · 0 评论 -
Makefile中使用 CFLAGS 与 SRC 的组织编译文件的2种工程实践和3个Makefile自动变量
在工程实践中总是会把教科书上的灵活运用,比如拆分到多个文件还是有一定的工程效能的。值得体会体会。原创 2024-03-15 23:38:03 · 1103 阅读 · 0 评论 -
如何把复杂的Makefile按照子模块拆分到不同的Makefile文件中的2个步骤?以及为什么要独立到不同子目录?
对于大型的工程项目,需要多个 Makefile。或者把某个复杂的 Makefile 拆解到不同的 Make 文件中。如何将一个复杂的 Makefile 拆解到不同的文件达到类似 C 语言的 #include “xxx.c” 这种效果?注意,这里有一个工程实践,就是把每个子模块都在当前目录下创建了子目录,并且每个子目录添加了自己的cfg.mk。另外再子目录的cfg.mk的相对路径需要使用和主目录相同的相对关系。对于需要把某个模块拆分成多个子模块,此时该方法就能很好的做到单一职责原则以及开闭原则。原创 2024-03-15 23:14:24 · 399 阅读 · 0 评论 -
C语言如何使用宏定义封装printf等函数并且接收可变参数?编译预处理符号##的两种用途
如何自定义日志?可以通过宏定义 也可以定义独立函数。独立函数会带来一些性能损耗。所以最好用宏定义方式。使用宏定义方式存在一个问题,就是比如printf很多时候的参数是可变的,那么如何使用宏定义支持将可变的参数能够支持下面是模仿linux kernel的多级别log的方式76544321doif<=printf;while0MY_PRINT不会打印DBG,因为级别不够.原创 2024-01-29 23:34:37 · 1123 阅读 · 0 评论 -
C语言如何根据Makefile配置宏定义值进行编译预处理 #if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)
C语言如何根据Makefile配置宏定义值进行编译预处理 #if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)原创 2024-01-26 08:52:19 · 485 阅读 · 0 评论 -
手撕烂笔头-内核中一些不错的宏定义代码工具之WARN_ON_ONCE-解决异常刷屏问题
定义一个static 然后执行warn_on。原创 2023-08-12 14:23:42 · 1868 阅读 · 0 评论 -
手撕烂笔头-为什么C语言编译后除了.data段还需要.bss段?
BSS是英文Block Started by Symbol本质是一个Block(块),是一个Symbol block,存了很多symbol。我们知道数据存储最出名的就是.data和.bss这两个segment(段)。看起来这两个都是存储全局变量和静态初始化变量的,为什么还需要两个段?主要是为了节省存储空间。原创 2023-08-06 22:20:56 · 259 阅读 · 0 评论 -
C/C++知识扩充_C++头文件一览
C++头文件一览 C #include //设定插入点 #include //字符处理 #include //定义错误码 #include //浮点数处理 #include //对应各种运算符的宏 #include //定义各种数据类型最值的常量 #include //定义本地化C函数 #include //定义数原创 2013-09-18 21:11:31 · 2320 阅读 · 0 评论 -
C/C++知识扩充_cctype和climits的用法
cctype和climits的用法 一、 cctype中通常包括一些常用函数的判断,如某个字符是否为大写,用isupper()如果参数是大写字母,函数返回true, 还有像isalnum(),如果参数是字母数字,即字母或者数字,函数返回true.下面我们通过一个小示例来查看输出结果:cout 输出:i is : 0如果把参数改为'B',则会输出:i is : 1 其它函数的用法见下列原创 2013-09-18 21:11:29 · 7617 阅读 · 0 评论