文件IO 中的两个函数creat和open
今天开始学习unix/linux系统下的文件I/O函数—打开文件、读文件、写文件等。大多数文件I/O只需要用到5个函数:open,read,write,lseek已经close,这5个函数都直接调用同名的系统调用,所以是不带缓冲的,本节,主要介绍open和creat函数。
1.open函数
1)函数原型:
#include <fcntl.h>
int open(const char* pathname,int flags)
int open(const char* pathname,int flags,mode_t mode);
2)函数功能:
打开或建立一个文件。对于open函数,仅当创建文件时,才用到第三个参数
3)参数说明:
pathname:打开或创建的文件名
flags:用下列一个或多个常量进行“或”运算构成flags参数(这些常量定义在<fcntl.h>
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读写打开
以上三个常量只能选一个,下面的则可以多选:
O_APPEND 每次写时都追加到文件的尾端。
O_CREAT 若此文件不存在,则创建它。使用此选项时,需要第三个参数mode,用其 指定新文件的访问权限。
O_EXCL 如果同时制定了O_CREAT,而文件已经存在,则会报错。因此可以测试一个 文件是否存在,如果不存在,则创建此文件,这使测试和创建两者成为一个原子操作。
O_TRUNC 如果此文件存在,而且为只读或读写成功打开,则将其长度截短为0。
O_NOCTTY 如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。
O_NONBLOCK 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件, 则此选项为文件的本次打开操作和后续的I/O操作设置非阻塞模式。
mode:用下列一个或多个常量进行“或”运算构成mode参数(这些常量定义在sys/stat.h)
S_IRWXU:00700 拥有者读写执行权限
S_IRUSR: 00400 拥有者读权限
S_IWUSR:00200 拥有者写权限
S_IXUSR: 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 其他成员执行权限
也可以直接指定mode的值,如0777,0541等
注意:此处设定的mode的值并不是文件最终的权限,文件最终的权限是按照mode & ~umask得到的,而默认的umask是0022,所以如果想按照mode的值设置文件权限,需要在建立文件之前将umask的值设置为0000