AP I/O 笔记
文件的原子操作(stdio)
可用的文件I / O函数——打开文件、读文件、写文件等等。大多数Linux文件I / O只需用到5个函数:open、read、write、lseek 以及close。
不带缓存指的是每个read和write都调用内核中的一个系统调用。这些不带缓存的I / O函数不是ANSI C的组成部分,而是POSIX(Portable Operating System Interface of Unix UNIX型可植操作系统接口)组成部分。
对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,用open或creat返回的文件描述符标识该文件,将其作为参数传送给read或write。
在POSIX.1应用程序中,整数0、1、2应被代换成符号常数:
1.
2. STDOUT_FILENO
3. STDERR_FILENO
这些常数都定义在头文件 <unistd.h>中。
文件描述符的范围是0 ~ OPEN_MAX 。早期的UNIX版本采用的上限值是1 9 (允许每个进程打开2 0个文件),现在很多系统则将其增加至256。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
POSIX 函数部分
打开文件open :
函数名: open
功 能: 打开文件
用 法: int open(const char *pathname, int oflag, …/*, mode_t mode * / ) ;
返 值: 若成功为文件描述符,若出错为-1,出错时errno被设置;
说 明: pathname是要打开或创建的文件的名字。
oflag参数可用来说明此函数的多个选择项。
对于open函数而言,仅当创建新文件时才使用第三个参数。
oflag: 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 操作设置非阻塞方式
O_SYNC 使每次write 都等到物理I / O 操作完成
mode: S_IRWXU 用户主的读写和执行权
S_IRUSR 用户读
S_IWUSR 用户写
S_IXUSR 用户执行
S_IRWXG 组的读写执行
S_IRGRP 组读
S_IWGRP 组写
S_IXGRP 组执行
S_IRWXO 其它人的读写执行
S_IROTH 其它人读
S_IWOTH 其它人写
S_IXOTH 其它执行
打开文件creat:
函数名: creat
功 能: 创建一个新的文件
用 法: int creat(const char * pathname, mode_t mode);
返 值: 若成功为只写打开的文件描述符,若出错为- 1;
说 明: 一般都直接用 open来创建了
eg:
关闭文件close:
函数名: close
功 能: 关闭一个打开文件
用 法: int close (int filedes);
返 值: 若成功为0,若出错为- 1;
说 明: 当一个进程终止时,它所有的打开文件都由内核自动关闭。很多程序都使用
这一功能而不显式地用close关闭打开的文件。
eg:
#include <unistd.h>
定位已打开文件lseek:
函数名: lseek
功 能: 设置文件内容读写位置
用 法: off_t lseek(int filesdes, off_t offset, int whence);
返 值: 若成功为新的文件位移,若出错为- 1;
说 明: 若whence是SEEK_SET,则将该文件的位移量设置为距文件开始处offset 个字节。
若whence是SEEK_CUR ,则将该文件的位移量设置为其当前值加offset,offset 可为正或负。
若whence是SEEK_END ,则将该文件的位移量设置为文件长度加offset,offset 可为正或负。。
eg:
读文件read:
函数名: read
功 能: 从打开文件中读数据
用 法: ssize_t read(int fd, void *buf, size_t count);
返 值: 读到的字节数,若已到文件尾为0,若出错为- 1;
写文件write:
函数名: write
功 能: 从打开文件中写数据
用 法: ssize_t write(int fd, const void *buf, size_t count);
返 值: 若成功为已写的字节数,若出错为- 1;
ssize_t pread(int filedes, void *buffer, size_t size, off_t offset)
ssize_t pwrite(int filedes, const void *buffer, size t size, off_t offset)
类似于read和write,只是读写不是从文件当前位置开始,而是
从offset位置开始,并且函数执行完后也不影响当前文件指针位
置,即指针位置不改变。