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

2020-01-06 13:38:30丽君
  •   #define PROP_FILENAME "/dev/__properties__" 
  • static char property_filename[PATH_MAX] = PROP_FILENAME;    
  • #define PA_SIZE (128 * 1024)   
  •   static int map_prop_area_rw() 
  • {  prop_area *pa; 
  • int fd;  int ret; 
  •   /** 
  • * O_RDWR ==> 读写  * O_CREAT ==> 若不存在,则创建 
  • * O_NOFOLLOW ==> 如果filename是软链接,则打开失败  * O_EXCL ==> 如果使用O_CREAT是文件存在,则可返回错误信息 
  • */  fd = open(property_filename, O_RDWR | O_CREAT | O_NOFOLLOW | O_CLOEXEC | O_EXCL, 0444); 
  • if (fd < 0) {  if (errno == EACCES) { 
  • abort();  } 
  • return -1;  } 
  •   ret = fcntl(fd, F_SETFD, FD_CLOEXEC); 
  • if (ret < 0)  goto out; 
  •   if (ftruncate(fd, PA_SIZE) < 0) 
  • goto out;   
  • pa_size = PA_SIZE;  pa_data_size = pa_size - sizeof(prop_area); 
  • compat_mode = false;   
  • // mmap映射文件实现共享内存  pa = mmap(NULL, pa_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
  • if (pa == MAP_FAILED)  goto out; 
  •   /*初始化内存地址中所有值为0*/ 
  • memset(pa, 0, pa_size);  pa->magic = PROP_AREA_MAGIC; 
  • pa->version = PROP_AREA_VERSION;  pa->bytes_used = sizeof(prop_bt); 
  •   __system_property_area__ = pa; 
  •   close(fd); 
  • return 0;   
  • out:  close(fd); 
  • return -1;  } 
  •   int __system_property_area_init() 
  • {  return map_prop_area_rw();