Linux字符串处理

在Linux内核中,字符串处理函数与用户空间的C标准库类似,但为适应内核环境做了优化和调整。

1. 格式化输出函数

snprintf
  • 作用:安全格式化字符串(避免缓冲区溢出)。

  • 原型int snprintf(char *buf, size_t size, const char *fmt, ...);

  • 示例

    char buf[50];

    int len = snprintf(buf, sizeof(buf), "PID: %d, State: %s", task_pid_nr(current), "Running");

`scnprintf**
  • 作用 :与snprintf相同,但保证返回值为实际写入长度(不含结尾\0)。
  • 原型int scnprintf(char *buf, size_t size, const char *fmt, ...);
`vsnprintf**
  • 作用 :可变参数版本的snprintf
  • 原型int vsnprintf(char *buf, size_t size, const char *fmt, va_list args);

2. 字符串拷贝与连接

strlcpy
  • 作用 :安全拷贝字符串(保证结尾\0)。

  • 原型size_t strlcpy(char *dest, const char *src, size_t size);

  • 示例

    char dest[32];
    strlcpy(dest, "Hello Kernel", sizeof(dest));

strlcat
  • 作用 :安全连接字符串(保证结尾\0)。

  • 原型size_t strlcat(char *dest, const char *src, size_t size);

  • 示例

    char base[32] = "Hello";

    strlcat(base, " World", sizeof(base)); // 结果:"Hello World"

3. 内存操作函数

memcpy
  • 作用:复制内存区域(不处理重叠)。

  • 原型void *memcpy(void *dest, const void *src, size_t n);

  • 示例

    char src[] = "Data";

    char dest[10]; memcpy(dest, src, strlen(src) + 1); // 包括结尾\0

memmove
  • 作用:复制内存区域(处理重叠)。
  • 原型void *memmove(void *dest, const void *src, size_t n);

4. 字符串比较

strcmp / strncmp
  • 作用:比较字符串。

  • 原型

    int strcmp(const char *s1, const char *s2);

    int strncmp(const char *s1, const char *s2, size_t n);

  • 示例

    if (strncmp(cmd, "start", 5) == 0) { // 处理"start"命令 }

5. 字符串查找

strstr
  • 作用:查找子字符串。

  • 原型char *strstr(const char *haystack, const char *needle);

  • 示例

    char *path = "/sys/devices/system";

    if (strstr(path, "system") != NULL) { // 路径包含"system" }

6. 字符串转换

kstrto*
  • 作用:字符串转整数(安全且支持进制)。
  • 常用函数

int kstrtoint(const char *s, unsigned int base, int *res);

int kstrtoul(const char *s, unsigned int base, unsigned long *res);

  • 示例

    char num_str[] = "42"; int value;

    if (kstrtoint(num_str, 10, &value) == 0) {

    复制代码
          printk("Value: %d\n", value); // 输出42

    }

7. 动态字符串分配

kasprintf
  • 作用 :动态分配并格式化字符串(类似sprintf)。

  • 原型char *kasprintf(gfp_t gfp_mask, const char *fmt, ...);

  • 示例

    char *msg = kasprintf(GFP_KERNEL, "Error %d in %s", errno, func); if (msg) {

    复制代码
          printk("%s\n", msg);
    
          kfree(msg); // 需手动释放

    }

8. 字符串长度

strlen
  • 作用 :计算字符串长度(不含\0)。
  • 原型size_t strlen(const char *s);

关键注意事项:

  1. 避免不安全函数 : 不使用sprintfstrcpy等可能溢出的函数,优先用snprintfstrlcpy
  2. 内存分配 : 使用kasprintfkstrdup分配字符串后,必须用kfree释放。
  3. 错误处理 : 检查函数返回值(如kstrto*返回0表示成功)。
  4. 头文件 : 包含<linux/string.h><linux/kernel.h>等。

完整示例:格式化与转换

复制代码
#include <linux/kernel.h>
#include <linux/string.h>

void log_process_info(void) {
    char buf[100];
    // 格式化字符串
    int len = snprintf(buf, sizeof(buf), "Process: %s (PID: %d)", current->comm, task_pid_nr(current));
    
    // 安全拷贝
    char dest[50];
    strlcpy(dest, buf, sizeof(dest));
    
    // 字符串转整数
    char count_str[] = "100";
    unsigned long count;
    if (kstrtoul(count_str, 10, &count) == 0) {
        printk("Count: %lu\n", count);
    }
}

通过以上函数,内核能高效、安全地处理字符串操作。

相关推荐
wdfk_prog10 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
盟接之桥11 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
忆~遂愿11 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
湘-枫叶情缘11 小时前
1990:种下那棵不落叶的树-第6集 圆明园的对话
linux·系统架构
Fcy64812 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满12 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠12 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Gary Studio12 小时前
rk芯片驱动编写
linux·学习
mango_mangojuice12 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
Harvey90312 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s