文件IO编程七

这一节主要是讲mmap()和错误码的处理


mmap函数

mmap()函数在进程的虚拟内存空间中映射出一块内存区域,用以对应指定的一个文件,该内存区域上的数据对应的文件的数据是一一对应的,并在一开始的时候用文件的内容来初始化这片内存。

void *mmap(void *addr, size_t length,int prot, int flags, int fd, off_t offset);

addr:映射内存起始的地址,如果参数为null,则系统会自动寻找一个合适的起始地址,一般都使用这个值。

length:映射内存大小。

prot:映射内存的保护权限。  PROT_EXEC:可执行  PROT_READ:可读   PROT_WRITE:可写  PROT_NONE:不可访问

flags:当有多个进程同时映射了这块内存时,该参数可以决定在某一个进程内使映射内存的数据发生变更是否影响其他进程,也可以决定是否影响其他对应的文件数据。

以下两个选项互斥:

MAP_SHARED:所有的同时映射了这块内存的进程对数据的变更均可见,而且数据的变更会直接同步到对应的文件。

MAP_PRIVATE:与上面相反。

fd: 要映射的文件的描述符。

offset:文件映射的开始区域偏移量,该值必须是页内存大小的整数倍。

这个函数经常使用于LCD屏。 该屏一个像素有四个字节分别是透明度,红绿蓝(RGB)

#define BLACK 0x00000000
#define WHITH 0xFFFFFFFF
#define BLUE  0x000000FF
#define GREEN 0x0000FF00
#define RED   0x00FF0000

int lcd = open("/dev/fb5", O_RDWR|O_EXCL);
if(lcd == -1)
{
perror("open() failed");
exit(1);
}

char *p_lcd;
p_lcd = mmap(NULL, 800*480*4,PROT_READ|PROT_WRITE, MAP_SHARED, lcd, 0);


unsigned x = RED;
for(i=0; i< 800*480;i++)
memcpy(p_lcd+(4*i), &x, 4);



错误代码处理

我们经常会用到打印错误码,比如open,read函数这些都是调用库函数,如果他们出错的时候,他们都会去更改errno这个全局变量,记住它是全局的。然后返回-1,但是此时errno就会变成100或者200,这些数字将会对应所表示的错误。

第一种可以用perror("open() failed");

将会打印open() failed:......系统会自动补上:分号并且补上错误的内容。

第二种可以用strerror(errno);

这个会返回一个错误的字符串。

printf("mmap() failed: %s\n", strerror(errno));


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值