深入剖析Android中init进程实现的C语言源码

2020-01-06 13:38:30丽君
  • goto cleanup;  } 
  •   pa_size = fd_stat.st_size; 
  • pa_data_size = pa_size - sizeof(prop_area);   
  • /*   * 映射init创建的属性内存到本地进程空间,这样本地进程就可以使用这块共享内存了。 
  • * 注意:映射时制定了PROT_READ属性,所以客户端进程只能读属性,不能设置属性。  */ 
  • prop_area *pa = mmap(NULL, pa_size, PROT_READ, MAP_SHARED, fd, 0);   
  • if (pa == MAP_FAILED) {  goto cleanup; 
  • }   
  • if ((pa->magic != PROP_AREA_MAGIC) || (pa->version != PROP_AREA_VERSION && pa->version != PROP_AREA_VERSION_COMPAT)) {  munmap(pa, pa_size); 
  • goto cleanup;  } 
  •   if (pa->version == PROP_AREA_VERSION_COMPAT) { 
  • compat_mode = true;  } 
  •   result = 0; 
  •   __system_property_area__ = pa; 
  • cleanup:  if (fromFile) { 
  • close(fd);  } 
  •   return result; 
  • }   
  • int __system_properties_init()  { 
  • return map_prop_area();  } 

    通过对源码的阅读,可以发现,客户端通过mmap映射,可以读取属性内存的内容,但是没有权限设置属性。那客户端是如何设置属性的呢?这就涉及到下面要将的属性服务器了。

    属性服务器的分析