当编写驱动程序时,一般情况下不能使用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库函数的更多相关文章

  1. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  2. Linux系统调用和库函数调用的区别

    Linux下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions).系统调用实际上就是指最底层的一个调用,在linux程序设计里面就是底层调用的意思 ...

  3. C标准I/O库函数与Unbuffered I/O函数

    一.C标准I/O库函数.Unbuffered I/O函数 1. C标准I/O库函数是如何用系统调用的 fopen(3) 调用open(2)打开制定的文件,返回一个文件描述符(一个int类型的编号),分 ...

  4. [Django]模型提高部分--聚合(group by)和条件表达式+数据库函数

    前言:本文以学习记录的形式发表出来,前段时间苦于照模型聚合中group by 找了很久,官方文章中没有很明确的说出group by,但在文档中有提到!!! 正文(最后编辑于2016-11-12): 聚 ...

  5. STM32库函数编程、Keli/MDK、stm32f103zet6

    catalogue . Cortex-M3地址空间 . 基于标准外设库的软件开发 . 基于固件库实现串口输出(发送)程序 . 红外接收实验 . 深入分析流水灯例程 . GPIO再举例之按键实验 . 串 ...

  6. LPC1768/1769之CAN控制器概述(附库函数下载地址)

    一.背景: 使用LPC1769来做CAN的收发,在此对使用LPC1769的CAN控制器进行收发做个总结和记录,以备下 次开发快速上手使用. 附:LPC1768/1769除了支持最高频率不同以外,其它基 ...

  7. 如何快速上手使用STM32库函数

    一.背景 如前文所述,利用标准库函数的好处在于,可以快速开发,不用去对着数据手册,小心翼翼的一位一位的配置那些繁复的寄存器,因为这些工作意法半导体已经找了一些顶级的工程师帮你做了,杰作既是其库函数.当 ...

  8. 【XLL 框架库函数】 TempActiveRef/TempActiveRef12

    [XLL 框架库函数] TempActiveRef/TempActiveRef12 创建一个包含所有激活工作表引用区域 XLOPER/XLOPER12 LPXLOPER TempActiveRef(B ...

  9. linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...

  10. C语言-两个库函数

    两个库函数 --1-- printf函数 1.1 printf 函数的介绍 1.2 格式控制字符串 1.3 %f输出精度的问题 1.4 printf 函数使用注意事项 --2-- scanf函数 2. ...

随机推荐

  1. openfire在内网的情况下 文件传输代理的设置

    openfire在内网的情况下 文件传输代理的设置 http://blog.csdn.net/v6543210/article/details/22506565

  2. JavaScript里的小妖精

    JavaScript里的小妖精———this!! 关于this指向这个问题,活生生折磨了我一个下午,回来静下心捋顺一下,总结出来一下规律. 当然,this这个复杂的问题不是一句两句可以说清楚,作为菜鸟 ...

  3. tomcat8特性

    作者:Eilen,转载需注明.博客主页:http://www.cnblogs.com/Eilen/ 一.Apache Tomcat 8介绍 Apache Tomcat 8RC1版于前几日发布.它 经过 ...

  4. ASP .NET CORE 部署linux 系统上的所需要的sdk 使用链接

    https://www.microsoft.com/net/learn/get-started/linuxopensuse

  5. python的多线程、多进程代码示例

    python多进程和多线程的区别:python的多线程不是真正意义上的多线程,由于python编译器的问题,导致python的多线程存在一个PIL锁,使得python的多线程的CPU利用率比预期的要低 ...

  6. HDU-1671

    Phone List Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  7. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——四大变换&光照与材质

    第13章 四大变换 在Direct3D中,如果为进行任何空间坐标变换而直接绘图的话,图形将始终处于应用程序窗口的中心位置,默认这个位置就成为世界坐标系的原点(0,0,0).而且我们也不能改变观察图形的 ...

  8. react-router 页面离开 提示数据变更

    以前项目使用 react-router2.0, 业务层面页面离开的时候需要弹出自己的弹出框,根据用户的操作,进行是否可以离开 试了几种方式都存在问题,实现的并不完美,没办法对用户点击浏览器后退支持的很 ...

  9. WIN2003配置多个网站

    刚刚在IIS下配置两个个网站,让客户端都用域名的方式访问,发现用主机头方式可以实现. 1. 首先你得有两个傻逼网站源码. 2. 为这两个网站注册域名并绑定IP,在万网上就可以搞定.譬如 www.a.c ...

  10. C++ 单例模式的几种实现研究

    都是从网上学得,整理下自己的理解. 单例模式有两种实现模式: 1)懒汉模式: 就是说当你第一次使用时才创建一个唯一的实例对象,从而实现延迟加载的效果. 2)饿汉模式: 就是说不管你将来用不用,程序启动 ...