https://blog.csdn.net/jaken99/article/details/77686427 lseek 注意fseek的区别,设置读写位置
https://blog.csdn.net/oscarjulia/article/details/72638060 一般open打开设备文件(二进制),fopen打开普通文件
https://blog.csdn.net/lyj2014211626/article/details/71844122 fopen w+ 创建读写 r+ 读写不能创建 r 只读 w只写
https://blog.csdn.net/MAOTIANWANG/article/details/17504771 umask 屏蔽权限使用
以下是我之前在展锐平台上做双摄标定数据存储的部分实现代码(简化版),涉及到一些客制化metadata的添加,从CaptureRequest中取requset的metadata就不细说啦,基于Android平台读写对应分区文件还需要注意sepolicy,具体的存储方式格式等可自己添加,主要是对一些固定的实现函数fopen open等做一个记录(在Linux平台上应该也适用吧),方便回忆
#define DATA_PATH "/mnt/vendor/productinfo/results.bin"
#define RESULT_PATH "/mnt/vendor/productinfo/result"
#DATA_SIZE 2048
//open 写数组到bin文件中 [umask open(O_RDWR | O_CREAT ) lseek(SEET_SET) write close]
bool saveData(const uint8_t *data)
{
mode_t pCurMask = umask(0); //返回原来的umask值,umask用于屏蔽对应用户,组,其他的读写执行权限
int Fd;
Fd = open(DATA_PATH, O_RDWR | O_CREAT, 0777);
if (Fd == -1) {
HAL_LOGE("can't open %s \t error msg: %s\n", DATA_PATH, strerror(errno));
return false;
}
if (-1 == lseek(Fd, 0, SEEK_SET)) { //SEEK_SET 设置新的读写位置,SEEK_CUR当前位置偏移,SEEK_END文件尾部偏移
HAL_LOGE("lseek error msg: %s\n", strerror(errno));
close(Fd);
return false;
}
if (data[0] != '0' && strlen((char*)data) != 1) {
if (-1 == write(Fd, data, DATA_SIZE)) {
HAL_LOGE("write error msg: %s\n", strerror(errno));
close(Fd);
return false;
}
}
close(Fd);
Fd = -1;
umask(pCurMask); //复原,每个进程都有其原来的umask值 umask值为8进制
return true;
}
//fopen 写到普通文件中 [fopen( w+ r+ ) fprintf fclose]
bool SaveResult(const int32_t Result)
{
FILE* pResult = NULL;
mode_t pCurMask = umask(0);
pResult = fopen(RESULT_PATH, "w+");
if (pResult == NULL) {
HAL_LOGE(" can't open %s \t error msg: %s\n", RESULT_PATH, ::strerror(errno)); //::代表全局函数调用
return false;
}
fprintf(pResult, "%d\n", Result);// fprintf fputs fputc 三种写入
fclose(pResult);
pResult = NULL;
umask(pCurMask);
return true;
}
//open 从bin文件中读出数组 [open lseek( SEEK_SET ) read close]
bool readData(uint8_t *data)
{
int nr, cnt = 0;
uint32_t readCnt = 0;
int readFd = open(DATA_PATH, O_RDONLY);
if (readFd < 0) {
ALOGE("readData can't open %s \t error msg: %s\n", DATA_PATH, strerror(errno));
return false;
}
if (-1 == lseek(readFd, 0, SEEK_SET)) {
ALOGE("readData lseek error msg: %s\n", strerror(errno));
close(readFd);
return false;
}
if (-1 == read(readFd, data, DATA_SIZE)) {
ALOGE("readData write error msg: %s\n", strerror(errno));
close(readFd);
return false;
}
close(readFd);
readFd = -1;
return true;
}
//fopen 从普通文件中读取 [fopen fseek(SEEK_SET) fread fclose]
bool getResult(int32_t *data, int32_t count)
{
FILE* pResult = NULL;
char read_buf=0;
pResult=fopen(RESULT_PATH,"r+");
if (pResult ==NULL)
{
ALOGE(" can't open RESULT_PATH path error msg: ");
return false;
}
if ((fseek(pResult,0,SEEK_SET)) < 0) //注意lssek和fseek的区别 fseek对应stream流 lseek对应open
{
ALOGE(" fseek error msg: %s\n", ::strerror(errno));
fclose(pResult);
return false;
}
size_t read_ret = fread (&read_buf, sizeof(char), sizeof(char),pResult);
if (read_ret < 0)
{
ALOGE(" can't fread RESULT_PATH file error msg: ");
fclose(pResult);
return false;
}
if(read_ret == sizeof(read_buf))
{
ALOGI("getResultbuf = %d,%d\n",read_buf,__LINE__);
}else
{
ALOGI("getResultfread fali!!!buf = %s,%d\n",read_buf,__LINE__);
}
fclose(pResult);
pResult = NULL;
int is_read_buf = read_buf -'0';
*data = is_read_buf;
return true;
}