◎顺序文件
linux的普通文件事数据字节的集合.这些数据字节一个接一个顺序地存储在该文件中.所以也称顺序(sequential)文件.linux并不在数据上增加任何类型的内部结构.就linux来说,它并不是把数据分解成记录或字段.如果一项特定的应用要求使用某种类型的内部数据结构,则由作为你在数据上增加相应的结构.这使得linux对文件的接口变得特别简单.
◎文件描述符
在linux系统,通过文件描述符访问文件.每个进程最多能够同时使用OPEN_MAX个文件描述符.通过标准头文件<limits.h>访问OPEN_MAX值.对于linux讲 为256
OPEN_MAX 得定义实际上是<linux/limits.h>中.但是为了使程序具有可移植性质,不应该在代码中直接包含这个头文件. 因为在代码中包含#include <limits.h>语句时候,它就自动地被包含.
当启动一个进程时候,文件描述符0,1和2已经分配并被使用.文件描述符0用作标准输入设备 1用作输出设备 2用作错误输出设备.
每个分配得文件描述符和一个打开的文件描述(与该文件有关的信息结构,信息结构有:偏移值offset,文件访问模式mode,其他有关标志flag)相联系..
◎ open系统调用
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *path,int flags);
int open(const char *path,int flags,mode_t mode);
flags参数规定如何打开该文件 有三个参数选择:
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
还可以利用以下任意组合:
O_CREAT 打开文件时候,如果文件不存在则建立文件
O_EXCL 如果已经置O_CREAT并且文件存在,则强制open()失败
O_TRUNC 在open()时候,将文件长度截至0
O_APPEND 强制write()写在文件得结束处
还可以规定另外一些标志,但是在普通文件中并不使用他们.所有这些标志值得符号名称可以通过#include <fcntl.h>访问
参数mode用来规定该文件的访问权限位.<sys/stat.h>
S_IRUSR 文件所有者的读权限位
S_IWUSR 文件所有者的写权限位
S_IXUSR 文件所有者的执行权限位
S_IRGRP 文件用户组的读权限位
S_IWGRP 文件用户组的写权限位
S_IXGRP 文件。。。。执行权限
S_IROTH 文件其他用户的读权限位
S_IWOTH 文件其他用户的写权限位
S_IXOTH 文件其他用户的执行权限位
S_IRWXU=S_IRUSR|S_IWUSR|S_IXUSR
S_IRWXG=S_IRGRP|S_IWGRP|S_IXGRP
S_IRWXO=S_IROTH|S_IWOTH|S_IXOTH
S_ISUID 置set-uid位
S_ISGID 置set-gid位
当一个进程代表你创建文件时候,其权限位由与该进程相联系的umask值所修改.进程利用下列公式决定被创建的文件的实际权限位:
mode&(~umask)
这个表示,如果程序所创建的文件上所得到的权限位和在open()调用中所要求的mode参数不一致,不该惊讶.
※当open()检测到错误时候,由返回-1值表示.因为存在许多不同的产生错误的条件,由内核赋予外部整形变量errno相应的值,以此来指示发生了什么错误
open()调用的主要错误有:
ENOENT 没有规定O_CREAT就试图打开一个不存在的文件
EEXIST 利用O_CREAT|O_EXCL强制创建一个已经存在的文件
EACCES 没有该文件所需要的访问权限,或者没有文件路径名中包含的目录的搜索权限.
这些符号通过<errno.h>访问
◎如果没有出现错误,从open()调用的返回值是个文件描述符.在随后对该文件的所有操作中将使用这个文件描述符.
文件描述符:本身是个小的非负整数,实际上是个指向打开文件描述的指针数组的索引.当一个文件描述符被分配时候,将搜索这个数组以找到第一个空闲的元素.结果是当打开一个文件时候,linux总是分配最低编号的空闲的文件描述符.
以后将看到-讨论如何实现输入输出重新定向到文件和管道时候,将得到好的利用.
◎有的时候试图打开一个特定的文件前,可能希望检验进程是否已经访问过该文件,可以用accessv()系统调用来完成.access()系统调用的一般形式是:
#include <unistd.h>
int access(char *pathname,int mode);
mode 是包含在文件<unistd.h>中的下列值之一:
R_OK 检验调用进程是否有过读访问
W_OK 。。。。。。。。。。写访问
X_OK 。。。。。。。。。。执行访问
F_OK 检验规定的文件是否存在