linux内核中的C语言常规算法(前提:你的编译器要支持typeof和type)

简介:

学过C语言的伙伴都知道,曾经比较两个数,输出最大或最小的一个,或者是比较三个数,输出最大或者最小的那个,又或是两个数交换,又或是绝对值等等,其实这些算法在linux内核中通通都有实现,以下的代码是我从linux内核源码的kernel.c中抠出来的代码,我们来看看:

我们直接上代码:大笑

#include <stdio.h>
#include <stdlib.h>
/*
 * min()/max() macros that also do
 * strict type-checking.. See the
 * "unnecessary" pointer comparison.
 */
//比较两个数,如果x>y,输出y,否则输出x
#define min(x,y) ({ \
	typeof(x) _x = (x);	\
	typeof(y) _y = (y);	\
	(void) (&_x == &_y);		\
	_x < _y ? _x : _y; })
//比较两个数,如果x>y,输出x,否则输出y 
#define max(x,y) ({ \
	typeof(x) _x = (x);	\
	typeof(y) _y = (y);	\
	(void) (&_x == &_y);		\
	_x > _y ? _x : _y; })
//比较三个数的大小 ,输出最小的一项 
#define min3(x,y,z) ({   \
	typeof(x)  _min1 = (x) ; \
	typeof(y)  _min2 = (y) ; \
	typeof(z)  _min3 = (z) ; \
	(void) (&_min1 == &_min2) ; \
	(void) (&_min1 == &_min3) ; \
	_min1 < _min2 ? (_min1 < min3 ? _min1 : _min3) ; \
		(_min2 < _min3 ? _min2 : _min3) ;} )
//比较三个数的大小 ,输出最大的一项 
#define max3(x,y,z) ({   \
	typeof(x)  _max1 = (x) ; \
	typeof(y)  _max2 = (y) ; \
	typeof(z)  _max3 = (z) ; \
	(void) (&_max1 == &_max2) ; \
	(void) (&_max1 == &_max3) ; \
	_max1 > _max2 ? (_max1 > max3 ? _max1 : _max3) ; \
		(_max2 > _max3 ? _max2 : _max3) ;} )
//输出绝对值 
#define abs(x) ({				\
		int __x = (x);			\
		(__x < 0) ? -__x : __x;		\
	})
//交换两个数
#define swap(a,b)  \
	do{typeof(a) __tmp = (a); (a) = (b) ; b = (__tmp) ;}while(0)
int main(void)
{
	int ret = 0 ;
	ret = max(1,2);
	printf("%d\n",ret);
	printf("%d\n",abs(-100));
	int a = 2 ; 
	int b = 3 ; 
	swap(a,b);
	printf("%d %d\n",a,b);
	
	return 0 ;
}
运行结果如图所示:

这些算法在内核中通常用宏的规格来实现,关于C语言很多算法,其实在linux内核中几乎都有,比如链表,树,图,排序,字符串,加密等等的算法和数组结构都有实现,能够深入的去理解linux内核,对学习C语言是非常有帮助的。

目录
相关文章
|
2月前
|
安全 网络协议 Linux
深入理解Linux内核模块:加载机制、参数传递与实战开发
本文深入解析了Linux内核模块的加载机制、参数传递方式及实战开发技巧。内容涵盖模块基础概念、加载与卸载流程、生命周期管理、参数配置方法,并通过“Hello World”模块和字符设备驱动实例,带领读者逐步掌握模块开发技能。同时,介绍了调试手段、常见问题排查、开发规范及高级特性,如内核线程、模块间通信与性能优化策略。适合希望深入理解Linux内核机制、提升系统编程能力的技术人员阅读与实践。
207 1
|
2月前
|
Ubuntu Linux
Ubuntu 23.04 用上 Linux 6.2 内核,预计下放到 22.04 LTS 版本
Linux 6.2 带来了多项内容更新,修复了 AMD 锐龙处理器设备在启用 fTPM 后的运行卡顿问题,还增强了文件系统。
|
2月前
|
Ubuntu Linux
Ubuntu 23.10 现在由Linux内核6.3提供支持
如果你想在你的个人电脑上测试一下Ubuntu 23.10的最新开发快照,你可以从官方下载服务器下载最新的每日构建ISO。然而,请记住,这是一个预发布版本,所以不要在生产机器上使用或安装它。
|
2月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
196 0
|
2月前
|
Web App开发 缓存 Rust
|
2月前
|
Ubuntu 安全 Linux
Ubuntu 发行版更新 Linux 内核,修复 17 个安全漏洞
本地攻击者可以利用上述漏洞,攻击 Ubuntu 22.10、Ubuntu 22.04、Ubuntu 20.04 LTS 发行版,导致拒绝服务(系统崩溃)或执行任意代码。
|
11天前
|
存储 编解码 算法
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
【多光谱滤波器阵列设计的最优球体填充】使用MSFA设计方法进行各种重建算法时,图像质量可以提高至多2 dB,并在光谱相似性方面实现了显著提升(Matlab代码实现)
|
14天前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
100 1
|
12天前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)