1 文件描述符
内核为每个进程维护一个已打开文件的记录表(实现为结构体数组),文件描述符是一个较小的正整数(0—1023)(结构体数组下标),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读、写、创建、删除等操作。
常用基于文件描述符的函数有open(打开)、creat(创建)、close(关闭)、read(读取)、write(写入)、ftruncate(改变文件大小)、lseek(定位)、fsync(同步)、fstat(获取文件状态)、fchmod(权限)、flock(加锁)、fcntl(控制文件属性)、dup(复制)、dup2、select和ioctl。基于文件描述符的文件操作并非ANSI C的函数。
2 打开、创建和关闭文件
open和creat都能打开和创建函数,原型为:
#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);//文件名 打开方式 权限 int creat(const char *pathname, mode_t mode); //文件名 权限 //现在已经不常用了 creat函数等价于?open(pathname,O_CREAT|O_TRUNC|O_WRONLY,mode);
open()函数出错时返回-1,相关参数如下:
flags和mode都是一组掩码的合成值,flags表示打开或创建的方式,而mode表示文件的访问权限。
flags的可选项如下:
掩码 |
含义 |
O_RDONLY |
以只读的方式打开 |
O_WRONLY |
以只写的方式打开 |
O_RDWR |
以读写的方式打开 |
O_CREAT |
如果文件不存在,则创建文件 |
O_EXCL |
仅与O_CREAT连用,如果文件已存在,则强制open失败 |
O_TRUNC |
如果文件存在,将文件的长度截至0 |
O_APPEND |
已追加的方式打开文件,每次调用write时,文件指针自动先移到文件尾,用于多进程写同一个文件的情况。 |
O_NONBLOCK |
非阻塞方式打开,无论有无数据读取或等待,都会立即返回进程之中。 |
O_NODELAY |
非阻塞方式打开 |
O_SYNC |
同步打开文件,只有在数据被真正写入物理设备设备后才返回 |
mode的可选项有:
S_IRWXU 00700 权限,代表该文件所有者具有可读、可写及可执行的权限。
S_IRUSR 或S_IREAD,00400权限,代表该文件所有者具有可读取的权限。
S_IWUSR 或S_IWRITE,00200 权限,代表该文件所有者具有可写入的权限。
S_IXUSR 或S_IEXEC,00100 权限,代表该文件所有者具有可执行的权限。
S_IRWXG 00070权限,代表该文件用户组具有可读、可写及可执行的权限。
S_IRGRP 00040 权限,代表该文件用户组具有可读的权限。
S_IWGRP 00020权限,代表该文件用户组具有可写入的权限。
S_IXGRP 00010 权限,代表该文件用户组具有可执行的权限。
S_IRWXO 00007权限,代表其他用户具有可读、可写及可执行的权限。
S_IROTH 00004 权限,代表其他用户具有可读的权限
S_IWOTH 00002权限,代表其他用户具有可写入的权限。
S_IXOTH 00001 权限,代表其他用户具有可执行的权限。
但是通常采用直接赋数值的形式,如:
int fd = open(“1.txt”,O_WRONLY | O_CREAT,0755); //表示给755的权限 if(-1 == fd) { perror("open failed!\n"); exit(-1);
}
注意:LINUX中基于文件描述符的open函数,对于一个不存在的文件,不能通过O_WRONLY的方式打开,必须加上O_CREAT选项。
close用于文件的关闭:
int close(int fd);//fd表示文件描述词,是先前由open或creat创建文件时的返回值。
文件使用完毕后,应该调用close关闭它,一旦调用close,则该进程对文件所加的锁全都被释放,并且使文件的打开引用计数减1,只有文件的打开引用计数变为0以后,文件才会被真正的关闭。
Kris_示例代码_1
/************************************************************************* > File Name: my_open.c > Author: KrisChou > Mail:[email protected] > Created Time: Mon 18 Aug 2014 10:27:49 AM CST ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc, char *argv[]) { /* 打开文件 int fd; //描述符 fd = open(argv[1],O_RDONLY); if(fd == -1) { perror("open failed"); exit(1); } return 0; */ int fd; fd = open(argv[1],O_WRONLY | O_CREAT,0666); if(fd == -1) { perror("open failed"); exit(1); } return 0; }
Linux下基于文件描述符的文件操作(非缓冲)