1. 文件的概念:
文件在linux系统中,是对系统资源的一个抽象,是对系统资源进行访问的通用接口。linux下的系统资源都可表述为文件。这样做可以对这些资源提供接口,供系统编程接口设计。
2. 文件的类型:
普通文件:存储在系统磁盘上的普通文件,以字节为单位存储。文件系统本身不关心内容,只提供数据存储和访问的通道。文件内容是由应用程序解释的。
目录:目录是一种特殊的文件,可以打开,关闭以及进行相应操作
管道:(pipe)linux中的一种进程间通信机制
设备文件:设备文件没有具体内容,对设备文件的读写操作实际上是与某个设备输入输出操作关联在一起。字符设备文件对应字符设备,块设备文件对应块设备。
符号链接:是一种特殊的文件,内容是指向另一个文件的路径。
Socket:也是进程间通信的机制,与管道不同的是,他们可以在不同的主机上通信,即网络通信。
3. 文件描述符
应用程序中表示被打开的文件的一个整数,通过这个整数可以对文件进行操作。对于内核,都是通过使用这个文件描述符引用文件。
文件的索引节点:(inode)
文件的索引节点(inode)是文件的唯一标识。inode包含文件系统处理文件所需要的全部信息(如访问限,当前文件大小等)
存在两种类型inode:一个是内核inode,保存在内核;另一个是磁盘inode,保存在系统磁盘上。当进程打开一个文件时,保存在系统磁盘上的文件的inode就会被加载至内存,同时系统创建一个内核inode,当内核ionde被修改后,系统会将其同步到系统磁盘上。内核inode记录的是一些更通用的信息,忽略与具体的文件系统相关的一些信息。
4. 文件操作一般过程:
进程打开文件,若成功则返回一个文件描述符,应用程序通过文件描述符对文件操作,操作完成后,应用程序需要关闭文件。
函数有open,read,write,ioctl函数
open函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
参数说明:
pathname:要打开或者创建的文件名称
flags:指定打开的文件操作方式可取值有:
(1)O_RDONLY:只读方式打开
(2)O_WRONLY:只写方式打开
(3)O_RDWR:以读写方式打开
上面的常量必须要指定一个。另外可以用位或的方式添加其他部分标志量.
(1)O_CREAT:如果被打开的文件不存在,则自动创建
(2)O_EXCL:如果O_CREAT标志已经使用,那么当pathname指定的文件已经存在,则open返回失败。
(3)O_TRUNC:如果被打开的文件存在并且是以可写的方式打开,则清空原有的内容。
(4)O_APPEND:新写入的内容被加到原有的内容之后,即打开文件的读写位置被置于文件末尾处。
mode:指定新文件的访问权限
返回值:成功返回文件描述符,错误返回-1,设置errno。
read函数
#include<unsitd.h>
ssize_t read(int fd,void *buf,size_t count);
各个参数及返回值说明:
fd:文件描述符
buf:读取到的数据所存入的区域
count:需要一次读取的字节
返回值:成功则返回读到的字节数,若到文件结尾则返回0,出错返回-1设置errno。
注意:
read函数返回值情况分析:
(1)返回conut值说明成功读取conut个字节的数据。
(2)返回一个大于0小于count的值,原因可能是由一个信号打断了读取过程,或发生错误,或者读取的有效字节数大于0但不足count个,或者在读入count个字节前已经结束。
(3)返回0,说明文件读取结束。
(4)阻塞,说明没有可读的数据,若采取的非阻塞的方式,则立即返回错误。
(5)返回-1且errno为EINTR,表示在读入有效字节前收到一个信号,这种情况可以重新进行读操作。
(6)返回-1且errno值为EAGAIN,说明是在非阻塞的方式下读文件,并且没有可读的数据。
(7)返回-1且errno值为非EINTR或EAGAIN,表示由其他类型错误发生。
write函数
#include<unistd.h>
ssize_t write(int fd,const void *buf,size_t count);
参数说明类比read函数。
注意:
write函数返回值情况分析:
返回值等于count,说明数据全部写入成功。
返回-1且errno的值为ENOSPC,说明底层设备没有足够的空间。
ioctl函数
linux系统上,那些不能被抽象为读写的操作都由ioctl操作实现。
对于设备文件来说,ioctl函数常用于修改设备的参数。
#include <sys/ioctl.h>
int ioctl(int fd,int request,...);
各个参数说明:
(1)fd:要操作的文件描述符
(2)request:代表要进行的操作,不同的(设备)文件有不同的定义
(3)可变参数,取决于request参数,通常指向变量或者数据结构的指针。
(4)返回值:成功返回0,部分操作返回非负值,出错则返回-1.
close函数
调用close函数关闭一个打开的文件。
#include <unistd.h>
int close(int fd);
例子可以参考代码类。