kstrdup函数功能描述:kstrdup( )函数的功能是为常量字符串s分配内存空间并将该字符串拷贝到所分配的地址空间中。
kstrdup文件包含
#include<linux/string.h>
kstrdup函数定义
在内核源码中的位置:linux-3.19.3/mm/util.c
函数定义格式:
char *kstrdup(const char *s, gfp_t gfp)
kstrdup输入参数说明
s
:待分配内存空间的字符串。gfp
:分配模式,其取值及含义参考kmalloc( )函数的分析。
kstrdup返回参数说明
返回值指向为字符串所分配的内存空间的起始地址。
kstrdup实例解析
编写测试文件:kstrdup.c
头文件及全局变量声明如下:
#include <linux/string.h>
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("GPL");
static int __init kstrdup_init(void);
static void __exit kstrdup_exit(void);
模块初始化函数:
int __init kstrdup_init(void)
{
char * temp;
const char *s = "hello world! "; //定义一个常量字符串
char * addr = kstrdup( s, GFP_KERNEL); //调用函数,分配模式为GFP_KERNEL
printk("addr = 0x%lx\n", (unsigned long)addr); //将字符串s拷贝到内存中的起始地址
printk("*addr = %c\n", *addr); //输出第一个字符
printk("*addr+4 = %c\n", *(addr+4)); //输出第五个字符
for(temp = addr; *temp ! ='\0'; temp ++) //循环地址中的字符值
printk("%c", *temp);
printk("\n");
return 0;
}
模块退出函数:
void __exit kstrdup_exit(void)
{
printk("exit ok! \n");
}
模块初始化及退出函数调用:
module_init(kstrdup_init);
module_exit(kstrdup_exit);
实例运行结果及分析:
首先编译模块,执行命令insmod kstrdup.ko插入模块,然后执行命令dmesg -c,会出现如图所示的结果。
结果分析:
该测试程序中定义了一个常量字符串char * s = “hello world! "
,将其作为参数传递给kstrdup( )函数,目的是为该字符串分配一个内存空间,并将其拷贝到该内存空间中。然后输出addr的值可看到所分配的内存空间的起始地址,再输出地址偏移为0和4处的内容,依次为’h’
和’o'
,最后循环输出地址中的字符值,为“hello world! ”
,可知原字符串已经被分配空间,并且成功完成拷贝。