系统I/O

 


系统IO:读/写没有缓冲区
系统IO对象  -> 硬件设备文件,例如: 访问LCD液晶,触摸屏,红外传感器,温湿度传感器、超声波传感器

文件描述符            文件指针    
标准输入        STDIN_FILENO   ->(0)            stdin 
标准输出        STDOUT_FILENO  ->(1)         stdout
标准出错        STDERR_FILENO  ->(2)         stderr

 

系统I/O写入文件有两种方式:write()内存映射

 

例子(write):

#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

 

 

 

你可能感兴趣的:(linux)