simple_strtol
时间: 2023-12-17 16:04:51 浏览: 299
simple_strtol是一个函数,它的功能是将一个字符串转换为一个有符号长整数。函数的形式是`long simple_strtol(const char *cp, char **endp, unsigned int base)`。其中,`cp`是指向字符串的开始位置,`endp`是指向要分析的字符串末尾位置的指针,`base`是要使用的基数。这个函数会将字符串转换为一个有符号长整数,并将结果返回。如果转换过程中遇到非法字符,函数会停止转换,并将指针`endp`指向非法字符的位置。
#### 引用[.reference_title]
- *1* *2* *3* [linux 内核库函数](https://blog.csdn.net/qq_44710568/article/details/105382670)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
相关问题
比如我在cmdline中添加一个参数为panel_id=39,如何用访问saved_command_line来解析
可以参考以下代码来使用 `saved_command_line` 来解析 `panel_id` 参数:
```c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/string.h>
static int panel_id = -1; // 初始化为无效值
static int __init my_module_init(void)
{
pr_info("my_module: panel_id=%d\n", panel_id);
// 在这里使用 panel_id 参数进行其它操作
return 0;
}
static void __exit my_module_exit(void)
{
pr_info("my_module: exit\n");
}
module_init(my_module_init);
module_exit(my_module_exit);
// 解析 panel_id 参数
static int __init parse_panel_id(char *str)
{
char *ptr;
int id = -1;
ptr = strstr(saved_command_line, "panel_id=");
if (ptr != NULL) {
id = simple_strtol(ptr + strlen("panel_id="), NULL, 10);
}
if (id >= 0) {
panel_id = id;
pr_info("my_module: panel_id=%d\n", panel_id);
} else {
pr_info("my_module: panel_id not found\n");
}
return 1; // 返回 1 表示已处理该参数
}
// 注册解析函数
static int __init register_parse_panel_id(void)
{
parse_early_param("panel_id", parse_panel_id);
return 0;
}
early_initcall(register_parse_panel_id);
```
在该程序中,我们使用 `strstr` 函数在 `saved_command_line` 中搜索 `panel_id` 参数,并使用 `simple_strtol` 函数将其转换为整数类型。如果解析成功,则将其存储到全局变量 `panel_id` 中。在模块初始化函数 `my_module_init` 中,我们可以使用 `panel_id` 参数进行其它操作。
需要注意的是,由于 `saved_command_line` 是一个字符串指针,其内容可能会被修改,因此需要在解析参数时使用字符串操作函数(如 `strtok`、`strchr` 等)来确保正确性。同时,由于在使用 `saved_command_line` 时需要在 `early_initcall` 中注册解析函数,因此该方法并不适用于需要在模块初始化函数中使用参数的情况。
内核读取bootargs值为rootfstype=ramfs init=/init console=ttyS0,115200 no_console_suspend earlyprintk=aml-uart,0xc81004c0 ramoops.pstore_en=1 ramoops.record_size=0x8000 ramoops.console_size=0x4000 use_cma_first=1 androidboot.selinux=disabled logo=osd1,loaded,0x3d800000,576cvbs vout=576cvbs,enable hdmimode=720p50hz cvbsmode=576cvbs hdmitx= cvbsdrv=0 androidboot.firstboot=1 jtag=apee quiet androidboot.hardware=amlogic androidboot.boardid=5 androidboot.serialno=00440454F6C5131060T954F6C5269F5C mac=54:F6:C5:26:9F:5C androidboot.mac=54:F6:C5:26:9F:5C,怎么获取boardid的值
要获取 `boardid` 的值,可以在内核启动参数字符串中查找该参数并解析它的值。
在你提供的启动参数字符串中,`boardid` 的值为 `5`,可以通过以下步骤来获取:
1. 使用 `strsep()` 函数来分解启动参数字符串,以等号 (`=`) 为分隔符,将参数名和参数值分开。
2. 对每个参数名和参数值进行比较,找到 `boardid` 参数。
3. 如果找到 `boardid` 参数,将其对应的参数值转换成整数值。
以下是一个示例代码,可以在 Linux 内核中获取 `boardid` 的值:
```c
#include <linux/string.h>
...
const char *bootargs = NULL;
char *arg, *value;
int boardid = -1;
struct device_node *chosen = NULL;
chosen = of_find_node_by_path("/chosen");
if (chosen) {
bootargs = of_get_property(chosen, "bootargs", NULL);
if (bootargs) {
while ((arg = strsep((char **)&bootargs, " ")) != NULL) {
if (strlen(arg) == 0) {
continue;
}
if ((value = strchr(arg, '=')) != NULL) {
*value = '\0';
value++;
if (strcmp(arg, "boardid") == 0) {
boardid = simple_strtol(value, NULL, 10);
break;
}
}
}
}
}
if (boardid >= 0) {
// 处理 boardid 值
...
}
```
在上面的代码中,我们使用 `strsep()` 函数来分解启动参数字符串,并使用 `strcmp()` 函数比较参数名是否为 `boardid`。如果找到 `boardid` 参数,我们使用 `simple_strtol()` 函数将其对应的参数值转换成整数值。如果转换成功,我们就可以在代码中使用 `boardid` 的值。
阅读全文