首页 > 代码库 > 《UNIX环境高级编程》读书笔记 —— 文件 I/O

《UNIX环境高级编程》读书笔记 —— 文件 I/O

一、打开或创建一个文件

#include <fcntl.h>
int open(const char *pathname, int oflag, .../*mode_t mode*/);
    返回值:若成功则返回文件描述符,若出错则返回-1

oflag选项:
O_RDONLY
O_WRONLY
O_RDWR

以上三个常量中必须指定一个,且只能指定一个。
以下常量都是可选的:
O_APPED     每次写时追加到文件尾
O_CREAT     若文件不存在,则创建
O_EXCL      若同时指定了O_CREAT,而文件已经存在,则出错;否则创建文件
O_TRUNC     若文件存在且为只写或读写打开成功,则讲文件截断为0
O_NOCTTY    
O_NONBLOCK  若pathname指定的是一个FIFO、一个快特殊文件或者一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置非组赛模式。

O_DSYNC     每次write都等待物理I/O完成,但不等待文件属性更新
O_RSYNC
O_SYNC      每次write都等待物理I/O完成,包括write引起的文件属性更新所需的I/O



#include <fcntl.h>
int create(const char *pathname, mode_t mode);
    返回值:若成功则返回为只写打开的文件描述符,若出错则返回-1
    
该函数等效于:
    open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode)
    

二、关闭一个打开的文件

#include <unistd.h>
int close(int filedes);
    返回值:若成功则返回0,若出错则返回-1

关闭一个文件时还会释放该进程在该文件上的所有加锁。
当一个进程结束时,内核会自动关闭它所有打开的文件。


三、为一个打开的文件设置偏移量

#include <fcntl.h>
off_t lseek(int filedes, off_t offset, int whence);
    返回值:若成功则返回新的文件偏移量,若出错则返回-1

whence取值:
SEEK_SET    将文件偏移设置为距文件开始处offset个字节
SEEK_CUR    将文件偏移设置为当前值加offset,offset可为正或负
SEEK_END    将文件偏移设置为文件长度加offset,offset可为正或负

管道、FIFO和网络套接字不可设置偏移量


四、文件读写

#include <unistd.h>
ssize_t read(int filedes, void *buf, size_t nbytes);
    返回值:若成功则返回读到的字节数,若已到文件尾则返回0,若出错则返回-1

#include <unistd.h>
ssize_t write(int filedes, void *buf, size_t nbytes);
    返回值:若成功则返回已写的字节数,若出错则返回-1


五、文件共享


六、复制文件描述符

#include <unistd.h>
int dup(int filedes);
int dup2(int filedes, filedes2);
    返回值:若成功返回新的文件描述符,若失败返回-1

dup返回的是当前可用的最小的文件描述符
dup2则返回filedes2所指定的文件描述符,若filedes2已经存在,则先将其关闭


七、文件同步

#include <unistd.h>
int fsync(int filedes);
int fdatasync(int filedes);
void sync();

sync    该函数只是将所有修改过的块缓存加入写队列,并不等真正的写磁盘结束就返回,系统update守护进程会定期(30秒)调用该函数
fsync   只针对filedes描述符起作用,并且等待写磁盘操作结束然后返回
fdatasync   类似于fsync,但它只影响文件的数据部分,不同步更新文件属性

#include <fcntl.h>
int fcntl(int filedes, int cmd, .../* arg */);
    返回值:若成功则依赖于cmd,若失败则返回-1

八、文件控制

fcntl的5种功能:

复制一个现有的描述符  cmd = F_DUPFD
获得/设置文件描述符标记    cmd = F_GETFD / F_SETFD
    目前只有一个标志:FD_CLOEXEC
获得/设置文件状态标记 cmd = F_GETFL / F_SETFL
    文件状态标志:O_RDONLY  只读打开
                  O_WRONLY  只写打开
                  O_RDWR    读写打开
                  O_APPEND  *每次写时追加
                  O_NONBLOCK    *非阻塞模式
                  O_SYNC    *等待写完成(数据和属性)
                  O_DSYNC   *等待写完成(仅数据)
                  O_RSYNC   *同步读、写
                  O_FSYNC   *
                  O_ASYNC   *
                加*号的为F_SETFL所能修改的
获得/设置异步I/O所有权   cmd = F_GETOWN / F_SETOWN
获得/设置记录锁    cmd = F_GETLK / F_SETLK / F_SETLKW

#include <unistd.h>
int ioctl(int filedes, int request, ...);
    返回值:若出错返回-1,成功返回其他返回值