kernel中argv_split
时间: 2024-03-08 17:46:48 浏览: 208
命令行传参解析
4星 · 用户满意度95%
在Linux内核中,也有一个函数叫做`argv_split`,它用于将用户空间传递给内核的命令行参数字符串分割成多个子字符串。在内核中,这个函数通常用于解析用户空间传递的命令行参数,并将它们作为参数传递给系统调用或驱动程序。
`argv_split`函数的实现与用户空间的实现略有不同,因为内核中不能使用标准库函数。下面是一个简化版的内核实现:
```c
#include <linux/string.h>
#define MAX_ARGS 32
static char *argv[MAX_ARGS];
int argv_split(char *str, char **argbuf, int argbuf_len)
{
int argc = 0;
char *s = str;
char *arg = NULL;
int arg_len = 0;
int in_quotes = 0;
int i;
while (*s) {
if (argc == argbuf_len)
return -1;
if (*s == '"') {
in_quotes = !in_quotes;
} else if (*s == ' ' && !in_quotes) {
arg = kmalloc(arg_len + 1, GFP_KERNEL);
if (!arg)
return -1;
memcpy(arg, str, arg_len);
arg[arg_len] = '\0';
argbuf[argc++] = arg;
str = s + 1;
arg_len = 0;
} else {
arg_len++;
}
s++;
}
if (arg_len) {
arg = kmalloc(arg_len + 1, GFP_KERNEL);
if (!arg)
return -1;
memcpy(arg, str, arg_len);
arg[arg_len] = '\0';
argbuf[argc++] = arg;
}
for (i = 0; i < argc; i++)
argv[i] = argbuf[i];
argv[argc] = NULL;
return argc;
}
```
该函数接收一个字符串`str`,以及一个指向存储子字符串的缓冲区的指针`argbuf`和缓冲区的长度`argbuf_len`。函数会将`str`中的子字符串分割成多个部分,并将它们存储在`argbuf`中。如果`argbuf`不够大,函数将返回-1。
注意,由于该函数运行在内核态,因此不能使用标准库函数。在上面的实现中,我们使用了Linux内核提供的`kmalloc`函数来分配内存。
阅读全文