mprop.cpp
mprop.cpp
https://github.com/TangGee/mprop/blob/master/mprop.cpp
#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <sys/mman.h> #include <string.h> #define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_ #include <sys/_system_properties.h> #include <sys/system_properties.h> struct prop_info; struct prop_area; extern int __system_property_area_init(); extern int __system_property_get(const char *name, char *value); extern int __system_property_add(const char *name, unsigned int namelen, const char *value, unsigned int valuelen); extern const prop_info *__system_property_find(const char *name); extern prop_area *__system_property_area__; extern int __system_property_update(prop_info *pi, const char *value, unsigned int len); void usage() { printf("usage: mprop property_name property_value\n"); } int main(int argc,char **argv){ sleep(30); printf("start....\n"); const int fd = open("/dev/__properties__", O_RDWR | O_NOFOLLOW | O_CLOEXEC | O_EXCL, 0444); if (argc!=3) { usage(); return -1; } if (strlen(argv[1])+1>PROP_NAME_MAX) { printf("property name is to long\n"); return -1; } if (sizeof(argv[2])+1>PROP_VALUE_MAX) { printf("property value is to long\n"); return -1; } if (fd<0) { perror("open"); return -1; } struct stat fd_stat; if (fstat(fd, &fd_stat) <0) { perror("fstat"); return -1; } if (!S_ISREG(fd_stat.st_mode)) { printf("internal error\n"); return -1; } void *memory_area = mmap(NULL, fd_stat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); __system_property_area__ = (prop_area *)memory_area; printf("mapd...\n"); char value[PROP_VALUE_MAX]; bool update = true; if(__system_property_get(argv[1],value)<=0) { update = false; printf("update falsei\n"); } if (update) { printf("old value : %s\n",value); prop_info *pinfo = const_cast<prop_info *>(__system_property_find(argv[1])); if (!pinfo){ printf("internal error\n"); return -1; } if(__system_property_update(pinfo,argv[2],strlen(argv[2]))) { printf("update error\n"); return -1; } } else { printf("add value: name:%s value:%s\n",argv[1],argv[2]); if(__system_property_add(argv[1],strlen(argv[1]),argv[2],strlen(argv[2]))) { printf("update error\n"); return -1; } } printf("new value %s\n",argv[2]); return 0; }
https://github.com/TangGee/mprop/blob/master/build.sh
export CC=i686-linux-android-clang export CXX=i686-linux-android-clang++ PWD=`pwd` $CXX mprop.cpp -o mprop -static -l$PWD/x86_M/libc.a -l$PWD/x86_M/libdl.a
========== End
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
2018-08-14 Oracle-RAC原理
2018-08-14 ASP.NET跨平台实践:无需安装Mono的Jexus“独立版”
2018-08-14 Oracle与Sql server的区别
2018-08-14 Oracle数据库中心双活之道:ASM vs VPLEX
2018-08-14 使用Visual C ++和Open Folder自定义环境
2018-08-14 vscode Variables Reference