typedef struct file_info_value
{
std::string file_name_;
long size_;
int fd_;
char *buff_;
boost::recursive_mutex cond_mtx_;
boost::condition_variable_any cond_var_;
boost::atomic<bool> is_mmap_;
file_info_value(std::string file_name):file_name_(file_name),size_(0),fd_(-1),buff_(nullptr),is_mmap_(false)
{
fd_ = open(file_name.c_str(), O_RDONLY);
if (fd_ == -1)
{
size_ = 0;
}
else
{
struct stat st;
int r = fstat(fd_, &st);
if (r == -1)
{
size_ = 0;
close(fd_);
}
else
{
size_ = st.st_size;
}
}
}
~file_info_value()
{
if (fd_ != -1)
{
close(fd_);
munmap(buff_, size_);
}
}
//if data is too big,create file spilt more file_index,mmap more times(hfrz ptr as start addr)
int mmap_the_file()
{
if (fd_ == -1)
{
return -1;
}
buff_ = (char *)mmap(NULL, size_, PROT_READ, MAP_PRIVATE, fd_, 0);
if (buff_ == (void*)-1)
{
std::ostringstream oslog;
oslog << "mmap failed:"<< strerror(errno);
LOG4CXX_INFO(log4cxx::Logger::getLogger("logger2"), oslog.str());
close(fd_);
return -1;
}
is_mmap_ = true;
return 0;
}
}file_info, *ptr_file_info;
需要说明的mmap的失败的返回值为-1,第一个参数为映射起始地址,一般传NULL让系统指定映射起始地址,最后一个参数文件开始的偏移量,用于大文件的分段映射;munmap的第一个参数必须是mmap的返回值,第二个参数必须与mmap是第二个参数一致,否则会造成内存泄漏。