基本C库函数
当编写驱动程序时,一般情况下不能使用C标准库的函数。Linux内核也提供了与标准库函数功能相同的一些函数,但二者还是稍有差别。
|
类别 |
函数名 |
功能 |
函数形成 |
参数 |
描述 |
|
字符串转换 |
simple_strtol |
把一个字符串转换为一个有符号长整数 |
long simple_strtol (const char * cp, char ** endp, unsigned int base) |
cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。 |
|
|
simple_strtoll |
把一个字符串转换为一个有符号长长整数 |
long long simple_strtoll (const char * cp, char ** endp, unsigned int base) |
cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。 |
||
|
simple_strtoul |
把一个字符串转换为一个无符号长整数 |
long long simple_strtoul (const char * cp, char ** endp, unsigned int base) |
cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。 |
||
|
simple_strtoull |
把一个字符串转换为一个无符号长长整数 |
long long simple_strtoull (const char * cp, char ** endp, unsigned int base) |
cp指向字符串的开始,endp为指向要分析的字符串末尾处的位置,base为要用的基数。 |
||
|
vsnprintf |
格式化一个字符串,并把它放在缓存中。 |
int vsnprintf (char * buf, size_t size, const char * fmt, va_list args) |
buf为存放结果的缓冲区, size为缓冲区的大小,fmt为要使用的格式化字符串,args为格式化字符串的参数。 |
||
|
snprintf |
格式化一个字符串,并把它放在缓存中。 |
int snprintf (char * buf, size_t size, const char * fmt, ... ...) |
buf为存放结果的缓冲区, size为缓冲区的大小,fmt为格式化字符串,使用@…来对格式化字符串进行格式化,…为可变参数。 |
||
|
vsprintf |
格式化一个字符串,并把它放在缓存中。 |
int vsprintf (char * buf, const char * fmt, va_list args) |
buf为存放结果的缓冲区, size为缓冲区的大小,fmt为要使用的格式化字符串,args为格式化字符串的参数。 |
||
|
sprintf |
格式化一个字符串,并把它放在缓存中。 |
int sprintf (char * buf, const char * fmt, ... ...) |
buf为存放结果的缓冲区, size为缓冲区的大小,fmt为格式化字符串,使用@…来对格式化字符串进行格式化,…为可变参数。 |
||
|
字符串操作 |
strcpy |
拷贝一个以NUL结束的字符串 |
char * strcpy (char * dest, const char * src) |
dest为目的字符串的位置, src为源字符串的位置。 |
|
|
strncpy |
拷贝一个定长的、以NUL结束的字符串 |
char * strncpy (char * dest, const char * src, size_t count) |
dest为目的字符串的位置, src为源字符串的位置,count为要拷贝的最大字节数 |
与用户空间的strncpy不同,这个函数并不用NUL填充缓冲区,如果与源串超过count,则结果以非NUL结束 |
|
|
strcat |
把一个以NUL结束的字符串添加到另一个串的末尾 |
char * strcat (char * dest, const char * src) |
dest为要添加的字符串, src为源字符串。 |
||
|
strncat |
把一个定长的、以NUL结束的字符串添加到另一个串的末尾 |
char * strncat (char * dest, const char * src, size_t count) |
dest为要添加的字符串, src为源字符串,count为要拷贝的最大字节数 |
注意,与strncpy,形成对照, strncat正常结束。 |
|
|
strchr |
在一个字符串中查找第一次出现的某个字符 |
char * strchr (const char * s, int c) |
s为被搜索的字符串,c为待搜索的字符。 |
||
|
strrchr |
在一个字符串中查找最后一次出现的某个字符 |
char * strrchr (const char * s, int c) |
s为被搜索的字符串,c为待搜索的字符。 |
||
|
strlen |
给出一个字符串的长度 |
size_t strlen (const char * s) |
s为给定的字符串 |
||
|
strnlen |
给出给定长度字符串的长度 |
size_t strnlen (const char * s, size_t count) |
s为给定的字符串 |
||
|
strpbrk |
在一个字符串中查找第一次出现的一组字符 |
char * strpbrk (const char * cs, const char * ct) |
cs为被搜索的字符串,ct为待搜索的一组字符 |
||
|
strtok |
把一个字符串分割为子串 |
char * strtok (char * s, const char * ct) |
s为被搜索的字符串,ct为待搜索的子串 |
注意,一般不提倡用这个函数,而应当用strsep |
|
|
memset |
用给定的值填充内存区 |
void * memset (void * s, int c, size_t count) |
s为指向内存区起始的指针,c为 要填充的内容,count为内存区的大小 |
I/O空间的访问不能使用memset,而应当使用memset_io。 |
|
|
bcopy |
把内存的一个区域拷贝到另一个区域 |
char * bcopy (const char * src, char * dest, int count) |
src为源字符串,dest为目的字符串,而count为内存区的大小 |
注意,这个函数的功能与memcpy相同,这是从BSD遗留下来的,对I/O空间的访问应当用memcpy_toio或 memcpy_fromio |
|
|
memcpy |
把内存的一个区域拷贝到另一个区域 |
void * memcpy (void * dest, const void * src, size_t count) |
dest为目的字符串,Src为源字符串,而count为内存区的大小 |
对I/O空间的访问应当用memcpy_toio或 memcpy_fromio |
|
|
memmove |
把内存的一个区域拷贝到另一个区域 |
void * memmove (void * dest, const void * src, size_t count) |
dest为目的字符串,Src为源字符串,而count为内存区的大小 |
memcpy和memmove处理重叠的区域,而该函数不处理。 |
|
|
memcmp |
比较内存的两个区域 |
int memcmp (const void * cs, const void * ct, size_t count) |
cs为一个内存区,ct为另一个内存区,而count为内存区的大小 |
||
|
memscan |
在一个内存区中查找一个字符 |
void * memscan (void * addr, int c, size_t size) |
addr为内存区,c为要搜索的字符,而size为内存区的大小 |
返回c第一次出现的地址,如果没有找到c,则向该内存区传递一个字节。 |
|
|
strstr |
在以NUL结束的串中查找第一个出现的子串 |
char * strstr (const char * s1, const char * s2) |
s1为被搜索的串,s2为待搜索的串。 |
||
|
memchr |
在一个内存区中查找一个字符 |
void * memchr (const void * s, int c, size_t n) |
s为内存区,为待搜索的字符,n为内存的大小 |
返回c第一次出现的位置,如果没有找到c,则返回空。 |
|
|
位操作 |
set_bit |
在位图中原子地设置某一位 |
void set_bit (int nr, volatile void * addr) |
nr为要设置的位,addr为位图的起始地址 |
这个函数是原子操作,如果不需要原子操作,则调用__set_bit函数,nr可以任意大,位图的大小不限于一个字。 |
|
__set_bit |
在位图中设置某一位 |
void __set_bit (int nr, volatile void * addr) |
nr为要设置的位,addr为位图的起始地址 |
||
|
clear_bit |
在位图中清某一位 |
void clear_bit (int nr, volatile void * addr) |
nr为要清的位,addr为位图的起始地址 |
该函数是原子操作,但不具有加锁功能,如果要用于加锁目的,应当调用smp_mb__before_clear_bit 或smp_mb__after_clear_bit函数,以确保任何改变在其他的处理器上是可见的。 |
|
|
__change_bit |
在位图中改变某一位 |
void __change_bit (int nr, volatile void * addr) |
nr为要设置的位,addr为位图的起始地址。 |
与change_bit不同,该函数是非原子操作。 |
|
|
change_bit |
在位图中改变某一位 |
void change_bit (int nr, volatile void * addr) |
nr为要设置的位,addr为位图的起始地址。 |
||
|
test_and_set_bit |
设置某一位并返回该位原来的值 |
int test_and_set_bit (int nr, volatile void * addr) |
nr为要设置的位,addr为位图的起始地址。 |
该函数是原子操作 |
|
|
__test_and_set_bit |
设置某一位并返回该位原来的值 |
int __test_and_set_bit (int nr, volatile void * addr) |
nr为要设置的位,addr为位图的起始地址。 |
该函数是非原子操作,如果这个操作的两个实例发生竞争,则一个成功而另一个失败,因此应当用一个锁来保护对某一位的多个访问。 |
|
|
test_and_clear_bit |
清某一位,并返回原来的值 |
int test_and_clear_bit (int nr, volatile void * addr); |
nr为要设置的位,addr为位图的起始地址。 |
该函数是原子操作 |
|
|
__test_and_clear_bit |
清某一位,并返回原来的值 |
int __test_and_clear_bit (int nr, volatile void * addr); |
nr为要设置的位,addr为位图的起始地址。 |
该函数为非原子操作 |
|
|
test_and_change_bit |
改变某一位并返回该位的新值 |
int test_and_change_bit (int nr, volatile void * addr) |
nr为要设置的位,addr为位图的起始地址。 |
该函数为原子操作 |
|
|
test_bit |
确定某位是否被设置 |
int test_bit (int nr, const volatile void * addr) |
nr为要测试的第几位,addr为位图的起始地址。 |
||
|
find_first_zero_bit |
在内存区中查找第一个值为0的位 |
int find_first_zero_bit (void * addr, unsigned size) |
addr为内存区的起始地址,size为要查找的最大长度 |
返回第一个位为0的位号 |
|
|
find_next_zero_bit |
在内存区中查找第一个值为0的位 |
int find_next_zero_bit (void * addr, int size, int offset) |
addr为内存区的起始地址,size为要查找的最大长度,offset开始搜索的起始位号。 |
||
|
ffz |
在字中查找第一个0 |
unsigned long ffz (unsigned long word); |
word为要搜索的字。 |
||
|
ffs |
查找第一个已设置的位 |
int ffs (int x) |
x为要搜索的字。 |
这个函数的定义方式与Libc中的一样。 |
|
|
hweight32 |
返回一个N位字的加权平衡值 |
hweight32 ( x) |
x为要加权的字 |
一个数的加权平衡是这个数所有位的总和。 |
基本C库函数的更多相关文章
- Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数
11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...
- Linux系统调用和库函数调用的区别
Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思 ...
- C标准I/O库函数与Unbuffered I/O函数
一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...
- [Django]模型提高部分--聚合(group by)和条件表达式+数据库函数
前言:本文以学习记录的形式发表出来,前段时间苦于照模型聚合中group by 找了很久,官方文章中没有很明确的说出group by,但在文档中有提到!!! 正文(最后编辑于2016-11-12): 聚 ...
- STM32库函数编程、Keli/MDK、stm32f103zet6
catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...
- LPC1768/1769之CAN控制器概述(附库函数下载地址)
一.背景: 使用LPC1769来做CAN的收发,在此对使用LPC1769的CAN控制器进行收发做个总结和记录,以备下 次开发快速上手使用. 附:LPC1768/1769除了支持最高频率不同以外,其它基 ...
- 如何快速上手使用STM32库函数
一.背景 如前文所述,利用标准库函数的好处在于,可以快速开发,不用去对着数据手册,小心翼翼的一位一位的配置那些繁复的寄存器,因为这些工作意法半导体已经找了一些顶级的工程师帮你做了,杰作既是其库函数.当 ...
- 【XLL 框架库函数】 TempActiveRef/TempActiveRef12
[XLL 框架库函数] TempActiveRef/TempActiveRef12 创建一个包含所有激活工作表引用区域 XLOPER/XLOPER12 LPXLOPER TempActiveRef(B ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- C语言-两个库函数
两个库函数 --1-- printf函数 1.1 printf 函数的介绍 1.2 格式控制字符串 1.3 %f输出精度的问题 1.4 printf 函数使用注意事项 --2-- scanf函数 2. ...
随机推荐
- 64_g2
gettext-libs-0.19.8.1-9.fc26.x86_64.rpm 15-Mar-2017 14:15 305038 gf2x-1.1-9.fc26.i686.rpm 11-Feb-201 ...
- mysql 数据库修改名字
通过information_schema信息修改rename database的目的 mysql 没有rename database 命令,只能变相修改表到目标库里的表来实现: 拼接reanme ta ...
- git学习笔记二-branch分支
1.刚创建好的空仓库的分支是空的,即使是master分支也是不存在的.master分支是不能通过git branch 来创建的,只有在完成第一次提交才会自动创建,有git自动完成master分子的创建 ...
- JavaSE项目之聊天室swing版
引子: 当前,互联网 体系结构的参考模型主要有两种,一种是OSI参考模型,另一种是TCP/IP参考模型. 一.OSI参考模型,即开放式通信系统互联参考模型(OSI/RM,Open Systems In ...
- vue数据绑定方式:
1,{{ }} 2,v-text 3,v-html 前两种接受普通变量,第三种绑定带有标签的内容,但是严禁使用,这个会有 XSS危险,(将字符串解析成源代码) 4,v-bind:title=‘m ...
- 面试题之实现系统函数系列一:实现memmove函数
编译环境 本系列文章所提供的算法均在以下环境下编译通过. [算法编译环境]Federa 8,linux 2.6.35.6-45.fc14.i686 [处理器] Intel(R) Core(TM)2 Q ...
- 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记8——载入三维模型&Alpha混合技术&深度测试与Z缓存
第17章 三维游戏模型的载入 主要是如何从3ds max中导出.X文件,以及如何从X文件加载三维模型到DirextX游戏程序里.因为复杂的3D物体,要用代码去实现,那太反人类了,所以我们需要一些建模软 ...
- hdu 1080(LCS变形)
Human Gene Functions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- Centos7yum安装LNMP
(1)安装nginx 0.关闭防火墙 systemctl stop firewald.service systemctl disable firewald.service 1.使用nginx官方提供的 ...
- ubuntu 16.04 LTS安装jenkins服务器
官方网站:https://jenkins.io/ 这里我们的系统是Ubuntu 16.04,所以选择Ubuntu的版本,另外,为什么选择2.60.3,而不是新的2.77?因为2.60.3是LTS版本, ...