Linux快速读取文件之文件映射c++实例

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是第二个参数一致,否则会造成内存泄漏。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值