在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);
关键注意事项:
- 避免不安全函数: 不使用
sprintf、strcpy等可能溢出的函数,优先用snprintf、strlcpy。 - 内存分配: 使用
kasprintf或kstrdup分配字符串后,必须用kfree释放。 - 错误处理: 检查函数返回值(如
kstrto*返回0表示成功)。 - 头文件: 包含
<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);
}
}
通过以上函数,内核能高效、安全地处理字符串操作。
2708

被折叠的 条评论
为什么被折叠?



