C++——open()、mmap()、write()

1.open()
头文件:

#include 
#include 
#include 

一个demo:

 signed int vpu_socket;
 vpu_socket = open("/dev/rkvdec", O_RDWR);//O_RDWR 以可读写方式打开文件

具体参考:http://blog.csdn.net/linux_loajie/article/details/43916677

2.mmap()
头文件:

#include 
#include 

void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);
说明:
start通常为NULL;
length为文件的长度;
prot代表映射区域的保护方式;
flags会影响映射区域的各种特性;
fd为open()返回的文件描述词;
offsize为文件映射的偏移量;
具体参考:
http://c.biancheng.net/cpp/html/138.html

运行的时候出现segmentation fault
原因:prot设置为PROT_READ,后面又改动了虚拟地址中的值。
解决方法:prot设置为PROT_WRITE

一个demo:

unsigned char *io_base;
int real_len = SZ_64K;
io_base = mmap(NULL, real_len PROT_READ, MAP_SHARED, mfd, real_base);

3.write()
头文件:

#include 

一种为:ssize_twrite(int handle, void *buf, int nbyte);
该函数将从指定的文件handle 中读取指定大小count个字节到从buf开始的缓冲区中。
handle 是文件描述符

访问物理地址的方式如下:

//打开设备
int fd=open("/dev/mem",O_RDWR);//fd为文件描述符。/dev/mem是整个物理地址空间。

//通过mmap映射物理地址到user space的虚拟地址
unsigned char *vir_addr=mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, physical_addr);//通过文件描述符和物理地址得到虚拟地址

//打印出错信息。如果mmap出错,那么vir_addr会返回(void *)-1;若正确则返回映射到的虚拟地址。
if (vir_addr== (void *)(-1)) {
        fprintf(stderr, "mmap() failed: %s\n", strerror(errno));
        exit(1);
    }

在android8.0上mmap出现错误,要使用mmap64()

你可能感兴趣的:(编程语言)