当前位置: 技术问答>linux和unix
内存溢出问题,急!!!
来源: 互联网 发布时间:2015-12-23
本文导语: //程序基本功能描述:在linux环境中,从usb摄像头不断地获取图片,压缩成jpg格式,以指定格式的 //文件名存到指定位置 //问题描述:运行一段时间后,报错:output file write error--out of disk space?,我定时手动 //把生成的图片删...
//程序基本功能描述:在linux环境中,从usb摄像头不断地获取图片,压缩成jpg格式,以指定格式的
//文件名存到指定位置
//问题描述:运行一段时间后,报错:output file write error--out of disk space?,我定时手动
//把生成的图片删除,保证不是因为图片过多的原因造成该结果.
哥们!我搞了一上午,没结果啊,经理在催了,哎!!! 帮我!!
代码如下:
int main(int argc,char argv[]){
.....declare variables
.....init codes.....
.....
.....
while(max_try){ //max_try初始化为5,即尝试打开摄像头,5次失败的话退出
dev=open(device,O_RDWR);
if(dev==-1){
if(!--max_try){
fprintf(stderr,"can't open the device %s",device);
retrun 1;
}
}else
break;
}
while(1){ //不断地获取图片,并压缩,以当前时间精确到3位毫秒为文件名存到指定文件夹
ftime(&tp); // struct timeb * tp
p=localtime(&tp.time); //struct tm * p
sprintf(struct_myfile.filename,"%s%04d%02d%02d%02d%02d%02d%03d.jpg",coorid,(1900+p->tm_year),(1+p->tm_mon),p->tm_mday,p->tm_hour,p->tm_min,t->tm_sec,tp.millitm);
// coorid 是一个字符串常量,struct_myfile是一个结构提有file和filename是
//长度为256的数组两个成员,保证使用sprintf()堆栈不益处
sprintf(struct_myfile.file,"/picture/%s",struct_myfile.filename);
//图片路径为/picture/..jpg
if(*(struct_myfile.file)){ //如果文件创建成功,打开文件
out=fopen(struct_myfile.file,"wb");// FILE * out
if(!out){
perror(struct_myfile.file);
return 1;
}
}
fseek(out,0,SEEK_SET);
if(!num){ //int num=0; 该if块只执行一次
if(v41_set_input(dev,input,norm)==-1)
return 1;
if(v41_check_size(dev,&width,&height)==-1)
return 1;
}
if(format==FMT_YUV4MPEG){ //FMT_YUV4MPEG 是一个常量
if(palette==VIDEO_PALETTE_YUV420P)
retrun to_yuv(out,dev,width,height);//函数to_yuv 的功能我也不明白,
//有个注释:write YUV4MPEG stream which is nice for mpeg2enc
break;
}
image=get_image(dev,width,height,paleete,&size);//获取图片,由char * image 指向
if(image){ //获取成功,写入out 指向的打开文件
put_image_jpeg(out,image,width,height,quality,palette);
if(size)
munmap(image,size);//释放image指向的内存
else if(image)
free(image);
}
}
}
//文件名存到指定位置
//问题描述:运行一段时间后,报错:output file write error--out of disk space?,我定时手动
//把生成的图片删除,保证不是因为图片过多的原因造成该结果.
哥们!我搞了一上午,没结果啊,经理在催了,哎!!! 帮我!!
代码如下:
int main(int argc,char argv[]){
.....declare variables
.....init codes.....
.....
.....
while(max_try){ //max_try初始化为5,即尝试打开摄像头,5次失败的话退出
dev=open(device,O_RDWR);
if(dev==-1){
if(!--max_try){
fprintf(stderr,"can't open the device %s",device);
retrun 1;
}
}else
break;
}
while(1){ //不断地获取图片,并压缩,以当前时间精确到3位毫秒为文件名存到指定文件夹
ftime(&tp); // struct timeb * tp
p=localtime(&tp.time); //struct tm * p
sprintf(struct_myfile.filename,"%s%04d%02d%02d%02d%02d%02d%03d.jpg",coorid,(1900+p->tm_year),(1+p->tm_mon),p->tm_mday,p->tm_hour,p->tm_min,t->tm_sec,tp.millitm);
// coorid 是一个字符串常量,struct_myfile是一个结构提有file和filename是
//长度为256的数组两个成员,保证使用sprintf()堆栈不益处
sprintf(struct_myfile.file,"/picture/%s",struct_myfile.filename);
//图片路径为/picture/..jpg
if(*(struct_myfile.file)){ //如果文件创建成功,打开文件
out=fopen(struct_myfile.file,"wb");// FILE * out
if(!out){
perror(struct_myfile.file);
return 1;
}
}
fseek(out,0,SEEK_SET);
if(!num){ //int num=0; 该if块只执行一次
if(v41_set_input(dev,input,norm)==-1)
return 1;
if(v41_check_size(dev,&width,&height)==-1)
return 1;
}
if(format==FMT_YUV4MPEG){ //FMT_YUV4MPEG 是一个常量
if(palette==VIDEO_PALETTE_YUV420P)
retrun to_yuv(out,dev,width,height);//函数to_yuv 的功能我也不明白,
//有个注释:write YUV4MPEG stream which is nice for mpeg2enc
break;
}
image=get_image(dev,width,height,paleete,&size);//获取图片,由char * image 指向
if(image){ //获取成功,写入out 指向的打开文件
put_image_jpeg(out,image,width,height,quality,palette);
if(size)
munmap(image,size);//释放image指向的内存
else if(image)
free(image);
}
}
}
|
you did not close the file which you opened for the output. then after some time, your program reached the maximum number of files allowed to open. so the solution is to add
fclose(out);
after finishing the output.
Regards
fclose(out);
after finishing the output.
Regards