getprop源码
时间: 2023-07-05 08:06:25 浏览: 109
getprop命令是Android系统中的一个工具,用于获取系统属性值。其源码位于system/core/toolbox/getprop.c文件中。
下面是getprop源码中的主要函数:
```c
int main(int argc, char** argv) {
// 读取命令行参数
parse_args(argc, argv);
// 打开系统属性文件
int fd = open(PROP_FILENAME, O_RDONLY | O_CLOEXEC);
if (fd < 0) {
error_exit("could not open '%s': %s", PROP_FILENAME, strerror(errno));
}
// 读取系统属性文件,并输出指定属性的值
char buffer[PROP_VALUE_MAX];
while (ReadPropertyLine(fd, buffer)) {
if (match_prefix(buffer, g_prop_name)) {
printf("%s\n", get_value(buffer));
close(fd);
return 0;
}
}
// 没有找到指定属性
close(fd);
return 1;
}
```
该函数首先调用`parse_args`函数解析命令行参数,然后打开系统属性文件,逐行读取属性值并查找指定属性。如果找到了指定属性,则输出其值并返回0。如果没有找到指定属性,则返回1。
ReadPropertyLine函数用于读取属性文件中的每一行,其实现如下:
```c
static bool ReadPropertyLine(int fd, char* buffer) {
char* p = buffer;
while (true) {
if (read(fd, p, 1) != 1) {
return false;
}
if (*p == '\n') {
*p = '\0';
return true;
}
if (++p - buffer >= PROP_LINE_MAX) {
error_exit("line too long in property file");
}
}
}
```
该函数从指定文件描述符中读取一个字符,并将其存储到缓冲区中。如果读取到换行符,则将其替换为字符串结束符号,并返回true。如果缓冲区已满,则调用`error_exit`函数退出程序。
match_prefix函数用于检查属性是否以指定的前缀开头,其实现如下:
```c
static bool match_prefix(const char* buffer, const char* prefix) {
return strncmp(buffer, prefix, strlen(prefix)) == 0;
}
```
如果属性以指定前缀开头,则返回true。
get_value函数用于获取属性值,其实现如下:
```c
static char* get_value(char* buffer) {
char* value = strchr(buffer, '=');
if (value == NULL) {
error_exit("badly formed property line");
}
// 返回属性值
return value + 1;
}
```
该函数在属性行中查找等号(=),并返回等号后面的字符串作为属性值。
以上就是getprop命令的源码实现。