函数名

格式化一个字符串,并把它放在缓存中。

用例

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-----为格式化字符串,使用@…来对格式化字符串进行格式化…-----为可变参数。

函数简介

几个打印函数的区别:

http://blog.sina.com.cn/s/blog_674b5aae0100prv3.html

第二节 字符串操作

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必须正常结束。

strcmp

函数名

比较两个字符串

用例

int strcmp(const char* cs, const char* ct)

参数说明

cs----待比较的源字符串

ct----待比较的目标字符串

函数简介

返回两个字符串的不同的位置

strncmp

函数名

比较两个特定长度的字符串

用例

int strncmp(const char*cs, const char* ct, size_t count)

参数说明

cs----待比较的源字符串

ct----待比较的目标字符串

count---最多比较的字符串长度,超过后就不比了

函数简介

使用头插法向链表添加一个新元素,易于实现栈结构

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-----为待搜索的一组字符

函数简介

在源字符串(source-string)中找出最先含有搜索字符串(searching-string)中的任一字符的位置并返回,若找不到则返回空指针。注意:返回值是指向源字符串的指针,所以在使用返回结果的时候,请确保源字符串的有效性。

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)

参数说明

des-----t为目的字符串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-----为内存区

c-----为待搜索的字符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-----为位图的起始地址。

函数简介

本函数是原子操作,nr可能会太大,导致更改越界。

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-----为位图的起始地址。

函数简介

该函数为非原子操作,若要用于加锁目的,应当调用smp_mb__before_clear_bit 或smp_mb__after_clear_bit函数,以确保任何改变在其他的处理器上是可见的。

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-----为位图的起始地址。

函数简介

检测*addr的第nr位是否为1(*addr右起最低位为第0位)

find_first_zero_bit

函数名

在内存区中查找第一个值为0的位

用例

int find_first_zero_bit (void * addr, unsigned size)

参数说明

addr-----为内存区的起始地址size-----为要查找的最大长度

函数简介

返回第一个位为0的位号,最低位从0开始offset最小值为0,最大值为sizeof(unsigned long)*8 - 1

find_next_zero_bit

函数名

在内存区中查找第一个值为0的位

用例

int find_next_zero_bit (void * addr, int size, int offset)

参数说明

addr---为内存区的起始地址size-----为要查找的最大长度offset-----开始搜索的起始位号。

函数简介

本函数用汇编写成,效率更高些

从源码级别,说明几个关于位操作的函数:

http://blog.csdn.net/iamonlyme/article/details/7081082

ffz

函数名

在字中查找第一个0

用例

unsigned long ffz (unsigned long word);

参数说明

word---要搜索的字。

函数简介

如果这个字没有0位,这个函数调用就成为未定义行为,所以使用之前先测试整个字是否为非0

ffs

函数名

查找第一个已设置的位(1)

用例

int ffs (int x)

参数说明

x---要搜索的字。

函数简介

这个函数的定义方式与Libc中的一样,编译器内建了这个方法。因此从本质上与ffz不同。

hweight32

函数名

返回一个N位字的加权平衡值

用例

hweight32 ( x)

参数说明

x----要加权的字

函数简介

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

小结

这次貌似做的多了一点。。。做IT就是这样,一旦来了感觉就停不下。。。话说本周的作业还没写完呢。。。我大操作系统,让我欢喜让我悲啊!整天提心吊胆的,睡觉都会想自己还没做完高操的作业,然后垂死病中惊坐起。。。

话说,写了这么多,一定要总结一下:

1. 链表部分,想要使用这些函数,必须明白链表的数据结构,如果不懂,问度娘。这些操作都是链表的基本函数;

2. 字符串操作部分,一定要注意以下几点:否需要加锁;是否读取合法区域;是否越界;未定义行为只有高手才配玩,我等码工还是好好写规范的代码吧。

3. 位操作部分,涉及到的函数都是很常规的一些,如果你对置位和清零不太清楚,可以查看一下组成原理的存储器部分,这里理解了硬件的实现过程对函数的使用有很大的帮助。

4. 剩下的一些周边函数,可以在使用到的时候来这里CTRLF搜一下,大概知道怎么用就好了。当然,推荐你MARK一下本文。本屌水平一般,但是本文是站在众巨人肩膀上写成的。此处也谢过各位活着和死去的大牛了。

明儿更内存管理,敬请关注:)

linux内核memset,linux内核API每天来一发(2)相关推荐

  1. linux内核memset,Linux库memset函数实现

    memset的函数原型是 void * memset ( void * ptr, int value, size_t num ); 这个函数的功能是将ptr所指向的某一块内存中的每个字节的内容全部设置 ...

  2. Linux内核:VFIO 内核文档 (实例,API,bus驱动API)

    <ARM SMMU原理与IOMMU技术("VT-d" DMA.I/O虚拟化.内存虚拟化)> <提升KVM异构虚拟机启动效率:透传(pass-through).DM ...

  3. linux内核中获取虚拟地址api,Linux内核-系统调用

    Linux内核-系统调用 1.与内核通信 #系统调用在用户空间进程和硬件设备之间添加了一个中间层 作用:1.为用户空间提供了一种硬件的抽象接口 2.系统调用保证了系统的稳定和安全 3.出于每一个进程都 ...

  4. linux 应用层编程之内核链表list的使用

    linux内核提供了一个经典通用的双向循环链表list的实现,任何模块都可以借助该接口实现自己的内部循环链表.因为是通用的,可以直接移植到用户态中使用,下面介绍相关的接口与一个简单操作例子,包括链表的 ...

  5. Linux 用户态与内核态的交互——netlink 篇

    [size=4]Linux 用户态与内核态的交互 --netlink 篇[/size] 作者:Kendo 2006-9-3 这是一篇学习笔记,主要是对<Linux 系统内核空间与用户空间通信的实 ...

  6. Linux用户态与内核态通信的几种方式(待完善)

    文章目录 1. 内核启动参数 2.模块参数与sysfs 3.sysctl 4.系统调用 5.netlink 6. procfs(/proc) 7.seq_file 8.debugfs 9.relayf ...

  7. 【Linux内核】Linux内核介绍

    Linux学习内核思路 学习过程: Linux内核引导及如何初始化 进程管理.内存管理 内核引导及过程: CPU通电后,首先执行引导程序,引导程序把内核加载到**内存,**然后执行内核,内核初始化完成 ...

  8. linux 用户态与内核态通信方式简介

    我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式.(关于 Linux 用户态和内核态可以参考 xx) 除此之外,还有以下四种方式: pro ...

  9. linux 内核将两个设备相关联,linux用户空间和内核空间交换数据

    转载地址:http://www.poluoluo.com/server/201107/138420.html 在研究dahdi驱动的时候,见到了一些get_user,put_user的函数,不知道其来 ...

最新文章

  1. 1024 鲲鹏开发者技术沙龙·福州站圆满收官!给程序员的福利你收到了吗?
  2. python之dict基础类型
  3. 被英特尔“冷落”的Knights Mill 悄然发布了
  4. PHPCMS最新版任意文件上传漏洞分析
  5. 下载 | 9G火爆的Python爬虫教程+ 520页《图解机器学习》
  6. 腾讯天美六位TA:技术美术这份职业会长期存在吗?
  7. Check_mk 主机状态为 down 但是主机下其他服务有数据且正常 解决方法
  8. input的type为number
  9. C++11保护共享数据的其他方法
  10. 【网站】Kiwi浏览器中文网
  11. 结构体嵌套结构体c语言,结构体的相互嵌套
  12. c语言c99标准_C语言的三套标准:C89、C99和C11
  13. OOAD-1 GOF中的23种设计模式的分类和功能
  14. 常用三种正态检验方法
  15. 去除ueditor自动默认添加p标签
  16. 【apache lang3】import org.apache.commons.lang3.StringUtils error----Cannot resolve symbol ‘lang3‘
  17. n96 微信 服务器繁忙,网友称塞班手机已无法登陆QQ/微信
  18. 将maximo工具栏图标放置在正上方
  19. mybatis实战:一、mybatis入门(配置、一些问题的解决)
  20. Unity3D——学习分享(一) 游戏开发

热门文章

  1. Android本地视频播放器开发 - 搜索本地视频(1)
  2. CSS 修改滚动条样式 隐藏浏览器滚动条
  3. VUE框架优化 - Render渲染 diff算法 -立哥开发
  4. Shell中单引号和双引号的使用
  5. 湘潭大学 计算机学院程诗婕,传播校园之声,讲好湘大故事 ——2019年度湘潭大学“十佳学生记者”和“优秀学生记者”颁奖典礼圆满落幕...
  6. 3D模型展示 | 黏土捏成的世界杯吉祥物,居然和实物这么像
  7. android代码混淆详解
  8. WideDeep简介
  9. 一年级新生家长php,一年级新生家长寄语大全
  10. java类 结构_java class类结构