首页 > 代码库 > 《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,成功返回其它返回值
   

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