系统IO:读/写没有缓冲区
系统IO对象 -> 硬件设备文件,例如: 访问LCD液晶,触摸屏,红外传感器,温湿度传感器、超声波传感器
文件描述符 文件指针
标准输入 STDIN_FILENO ->(0) stdin
标准输出 STDOUT_FILENO ->(1) stdout
标准出错 STDERR_FILENO ->(2) stderr
#include
#include //------
#include //--open
#include //------
#include //close、read、write
int main()
{
//以读写方式打开一个文件,如果文件不存在则创建,如果文件存在则清空内容
int fd = open("1.txt",O_RDWR | O_CREAT | O_TRUNC);
//将helloworld写入文件
char buf[10] = "helloworld";
write(fd,buf,sizeof(buf));
//从文件读出五个字节的数据
lseek(fd,0,SEEK_SET); //文件指针定位在开头
char t[5];
read(fd,t,sizeof(t));
printf("t = %s\n",t); //输出hello
//关闭文件
close(fd);
return 0;
}
#include //-----------
#include //---- open
#include //-----------
#include //close、
#include //mmap(内存映射)、munmap(撤销映射)
#include //memcpy(拷贝
#include
int main(int argc,char*argv[])
{
//1. 打开文件
int lcd;
lcd = open("/dev/fb0",O_RDWR); //打开LCD液晶屏幕
if(lcd < 0) //判断是否打开成功
printf("open lcd error!\n");
//2. 申请内存映射
int *p = mmap(NULL,800*480*4,PROT_READ|PROT_WRITE,MAP_SHARED,lcd,0);
if(p == (void *)-1) //判断内存映射是否成功
printf("mmap error!\n");
//3. 往内存空间中填充颜色
int color = 0x00FF00FF; //0x 00 FF 00 FF
int i; // A R G B A:透明度 RGB:红绿蓝
for(i=0;i<800*480;i++)
{
memcpy(p+i,&color,4); //开发板屏幕为800*480,填充颜色到每一个像素点
}
//4. 撤销映射
munmap(p,800*480*4);
//5. 关闭文件
close(lcd);
return 0;
}
#include //-----------
#include //---- open
#include //-----------
#include //close、read、write
#include //mmap(内存映射)、munmap(撤销映射)
#include //memcpy(拷贝)
//打开 / 关闭
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
int close(int fd);
//读 / 写
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
//文件偏移
off_t lseek(int fd, off_t offset, int whence);
//内存映射
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
//拷贝
void *memcpy(void *dest, const void *src, size_t n);
//撤销映射
int munmap(void *addr, size_t length);
int open(const char *pathname, int flags, mode_t mode); //打开文件
pathname: 文件路径
flags: 打开方式 O_RDONLY(读) O_WRONLY(写) O_RDWR(读/写)
mode: 文件创建时的权限,如(777)。 如果没有如果未指定O_CREAT,则忽略模式。
返回值:
成功:返回一个新文件描述符(0、1、2,已被使用。最小且没有被用过的整数)
失败:返回 -1
int close(int fd); //关闭文件
fd:文件描述符
返回值:
成功:返回0
失败:返回 -1
ssize_t read(int fd, void *buf, size_t count); //读
fd: 文件描述符
buf: 要读取到的内存
count: 读取的字节数
返回值:
成功:返回读取的字节数
失败:返回 -1
ssize_t write(int fd, const void *buf, size_t count); //写
fd: 文件描述符
buf: 要写入到的内存
count: 写入的字节数
返回值:
成功:返回写入的字节数
失败:返回 -1
off_t lseek(int fd, off_t offset, int whence); //文件偏移
fd: 文件描述符,
offset:偏移量
whence:基准点
SEEK_SET //开头位置
SEEK_CUR //当前位置
SEEK_END //末尾位置
返回值:
成功:偏移后的指针位置距离开头位置的字节
失败: (off_t)-1
//内存映射
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
addr: NULL -> 系统自动分配空间 99.99%
不为NULL -> 手动分配空间 0.01%
length: 内存映射的空间的长度 -> 例如:lcd就填800*480*4
prot: 保护权限
PROT_EXEC Pages may be executed.
PROT_READ Pages may be read. //一般写PROT_READ | PROT_WRITE
PROT_WRITE Pages may be written.
PROT_NONE Pages may not be accessed.
如果有多个权限,则使用"|"连接在一起,例如: PROT_READ|PROT_WRITE
flags:
MAP_SHARED -> 公开 //一般写 MAP_SHARED
MAP_PRIVATE -> 私有
fd: 进行映射的文件描述符
offset: 文件的偏移量
返回值:
成功: 指向该内存空间的起始地址
失败: (void *)-1
void *memcpy(void *dest, const void *src, size_t n); //拷贝数据到内存空间中
dest:目标地址 -> 地址上空间必须足够大。
src:需要拷贝的东西
n:需要拷贝的字节数
返回值:
成功: 指向dest的地址
失败: NULL
int munmap(void *addr, size_t length); //撤销映射
addr:内存的起始地址
length:需要撤销的映射长度
返回值:
成功:0
失败:-1