#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();
}