在android系统里,设计有一种系统叫做属性系统,它是用来做什么呢?这样设计有什么优势呢?其实这个属性系统主要是用来保存系统配置,或者用来交换不同进程的信息。这样的系统最大的优势是统一了系统配置的方式,统一了信息交换方式,通过共享内存的方式提高系统的性能。 下面就来分析属性系统的初始化函数,代码如下: #001 void property_init(void) #002 { #003 init_property_area(); 这行代码是调用函数init_property_area来设置属性内存的区域。
#004 load_properties_from_file(PROP_PATH_RAMDISK_DEFAULT); 这行代码是从ramdisk盘里加载属性文件。
#005 }
在这个函数里,需要查看一下宏定义,如下: #define PROP_PATH_RAMDISK_DEFAULT "/default.prop" 也就是从内存盘里加载属性文件/default.prop,并把这些属性放到属性系统里。
接着来分析函数init_property_area是怎么创建共享内存,并把属性放到里面给所有进程共享使用的,代码如下: #001 static int init_property_area(void) #002 { #003 prop_area *pa; #004 #005 if(pa_info_array) #006 return -1; 这段代码是判断当属性信息数组已经初始化,就直接返回。
#007 #008 if(init_workspace(&pa_workspace, PA_SIZE)) #009 return -1; 这段代码是调用函数init_workspace创建共享内存。
#010 #011 fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC); 这行代码是设置共享内存的执行结束后关闭。 ///FD_CLOEXEC,表示执行exec函数集时关闭FD(比如fork子进程时可以用FD,执行execl不再能访问FD) #012 #013 pa_info_array = (void*) (((char*) pa_workspace.data) + PA_INFO_START); 这行代码是保存创建共享内存指针。
#014 #015 pa = pa_workspace.data; #016 memset(pa, 0, PA_SIZE); 这段代码是清空属性共享的内存。
#017 pa->magic = PROP_AREA_MAGIC; #018 pa->version = PROP_AREA_VERSION; 这段代码是设置属性共享内存的版本号。
#019 #020 /* plug into the lib property services */ #021 __system_property_area__ = pa; 这行代码是设置属性共享内存可以给库的属性共享服务使用。
#022 #023 return 0; #024 } #025
从上面的函数里可以看到一个创建共享内存的函数,它是怎么样实现创建共享内存的呢?现在来分析它的代码 |
|