当前位置: 首页 > news >正文

linux 内核库函数 【转】

转自:http://blog.chinaunix.net/uid-20321537-id-1966892.html

当编写驱动程序时,一般情况下不能使用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为要加权的字

一个数的加权平衡是这个数所有位的总和。

 




















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/5650950.html ,如需转载请自行联系原作者

相关文章:

  • java 切割日期时间段,分割时间段
  • shell、python脚本终端颜色输出
  • 转换图片大小
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Linux系统查看系统是32位还是64位方法总结【转】
  • 扩展Label控件(1) - 实现回发(Postback)功能
  • 使用 Github Pages 发布你的项目文档
  • 解决客户一例:使用域超级管理员打开Exchange 2010发现没有权限
  • AngualrJs 微信支付url未注册大坑解决方法
  • mac终端下svn常用命令
  • http协议进阶(四)报文首部
  • QName
  • 浅议tomcat与classloader
  • Java中的匿名内部类
  • 移动端点击作弊与激活作弊的现象与预警
  • @jsonView过滤属性
  • [译]Python中的类属性与实例属性的区别
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • angular学习第一篇-----环境搭建
  • codis proxy处理流程
  • Fastjson的基本使用方法大全
  • flask接收请求并推入栈
  • Java Agent 学习笔记
  • JS函数式编程 数组部分风格 ES6版
  • Magento 1.x 中文订单打印乱码
  • Netty 4.1 源代码学习:线程模型
  • React Native移动开发实战-3-实现页面间的数据传递
  • spring-boot List转Page
  • Swift 中的尾递归和蹦床
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 初识MongoDB分片
  • 反思总结然后整装待发
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 字符串匹配基础上
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​插件化DPI在商用WIFI中的价值
  • #Linux(权限管理)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (2020)Java后端开发----(面试题和笔试题)
  • (4)logging(日志模块)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (LeetCode) T14. Longest Common Prefix
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (七)Java对象在Hibernate持久化层的状态
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (算法)Travel Information Center
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包