3.2 文件描述符
按照惯例,unix系统标准输入流的文件描述符为0,标准输出流的文件描述符为1,标准出错流的文件描述符为2。通常使用中的常量,STDIN_FILENO,
STDOUT_FILENO,STDERR_FILENO来代替幻数0 1 2。
--------------------------------------------------------
3.3 open函数
#include
int open(const char *pathname , int oflag , .../* mode_t mode */);
oflag: 由以下一个或多个常量进行“或”运算构成
O_RDONLY - 只读打开
O_WRONLY - 只写打开
O_RDWR - 读、写打开
以上常量只能指定一个且必须指定一个,下面的常量则是可选的:
O_APPEND - 每次写时都追加到文件的末尾
O_CREAT - 若此文件不存在,则创建它。使用此选项时,需要第三个参数mode
O_EXCL - 如果同时指定了O_CREATE,而文件已经存在,则会出错。
O_TRUNC - 如果此文件存在,而且为只写或读写,则将其长度截断到0.
O_NOCTTY - 如果pathname指的是终端设备,则不将该设备分配作为此进程的控制终端。
O_NONBLOCK - 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的IO操作设置非阻塞模式。
下面三个标志也是可选的:
O_DSYNC - 使每次write等待物理IO操作完成
O_RSYNC - 使得每一个以文件描述符作为参数的read操作等待,直至任何对文件同一部分进行的未决写操作都完成。
O_SYNC - 使得每次write都等到物理IO操作完成,包括由write操作引起的文件属性更新所需的IO。
由open返回的文件描述符一定是最小的未用描述符数值。
mode参数是以下常量 按位或 构成的:
S_IRWXU 00700 user (file owner) has read, write and execute
permission
S_IRUSR 00400 user has read permission
S_IWUSR 00200 user has write permission
S_IXUSR 00100 user has execute permission
S_IRWXG 00070 group has read, write and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others have read, write and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission
文件实际的权限属性是由 mode & ~umask 得到。所以如果想要创建出来的文件具有指定的权限,最好先调用umask函数,将权限屏蔽字置为0。
-----------------------------------------------------
3.4 create函数
#include
int create(const char *pathname , mode_t mode);
此函数等效于:
open(pathname, O_WRONLY | O_CREAT | O_TRUNC , mode);
此函数不足之处在于只能以只写模式创建文件。所以可以用open代替之。
-----------------------------------------------------
3.5 close函数
#include
int close(int filedes);
关闭一个文件时还会释放该进程加在该文件上的所有记录锁。当一个进程终止时,内核自动关闭它所有打开的文件。
-----------------------------------------------------
3.6 lseek函数
#include
off_t lseek(int filedes , off_t offset , int whence);
lseek显式地为一个打开的文件设置其偏移量。它仅将当前的文件偏移量记录在内核中,并不引起任何IO操作。
offset : 其值的解释与whence的值有关,代表相对偏移量
whence :
SEEK - offset以文件开始为基准
SEEK_CUR - offset以当前文件绝对偏移量为基准,可正可负
SEEK_END - offset以文件末尾为基准,可正可负
lseek若成功,则返回新的文件偏移量。文件偏移量可以大于当前文件长度,文件中的空洞由0补齐。
将offset设为0,whence设为SEEK_CUR,调用lseek可以用来测试文件描述符是否支持设置偏移量。如果文件描述符是一个管道、FIFO或者网络套接字,则lseek返回-1,
并将errno设置为ESPIPE。
-----------------------------------------------------
3.7 read函数
#include
ssize_t read(int filedes , void *buf , size_t nbytes);
-----------------------------------------------------
#include
ssize_t write( int filedes , void *buf , size_t nbytes);
-----------------------------------------------------
使用O_APPEND标志可以使 “定位-写” 两个动作变为一个原子动作,避免多个进程调用lseek定位到文件末尾再写导致写入数据被覆盖的问题
-----------------------------------------------------
#include
int dup(int filedes);
int dup2(int filedes , int filedes2);
这两个函数复制一个现存的文件描述符。其返回的新描述符与参数filedes共享一个文件表项。
dup返回的新文件描述符一定是当前可用文件描述符的最小数值。dup2可以用filedes2指定新描述符的值,如果filedes2已经打开,则先将其关闭。
dup(filedes); 等效于 fcntl(filedes,F_DUPFD,0);
dup2(filedes); 等效于 close(filedes2) ; fcntl(filedes , F_DUPFD , filedes2);
但是dup2 并不等同于 先close在fcntl,因为dup2是个原子操作。而且dup2和fcntl有不同的errno。
----------------------------------------------------
#include
int fsync( int filedes);
int fdatasync(int filedes);
void sync(void);
sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。通常称为update的系统守护进程会周期性的调用sync函数。命令
sync(1)也是调用sync函数。
fsync函数只对由文件描述符filedes指定的单一文件起作用,等待写磁盘操作结束再返回。它不仅影响数据部分,还影响文件属性
fdatasync与fsync类似,但只影响数据部分。
-------------------------------------------------------
#include
int fcntl (int filedes , int cmd , ... /* int arg */ );
fcntl函数可以改变已打开的文件的性质,共有五种功能:
1. 复制一个现有的描述符 (cmd=F_DUPFD)
2. 获得/设置文件描述符标记(cmd=F_GETFD,F_SETFD)
3. 获得/设置文件状态标志(cmd=F_GETFL , F_SETFL)
4. 获得/设置异步IO所有权(cmd=F_GETOWN , F_SETOWN)
5. 获得/设置记录锁(cmd=F_GETLK , F_SETLK , F_SETLKW)
具体使用见P63
阅读(373) | 评论(0) | 转发(0) |