Linux内核API kstrdup

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,会出现如图所示的结果。

Linux内核API kstrdup

结果分析:

该测试程序中定义了一个常量字符串char * s = “hello world! ",将其作为参数传递给kstrdup( )函数,目的是为该字符串分配一个内存空间,并将其拷贝到该内存空间中。然后输出addr的值可看到所分配的内存空间的起始地址,再输出地址偏移为0和4处的内容,依次为’h’’o',最后循环输出地址中的字符值,为“hello world! ”,可知原字符串已经被分配空间,并且成功完成拷贝。

赞(0)
未经允许不得转载:极客笔记 » Linux内核API kstrdup
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址