1.open
头文件:
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
定义函数:
Int open(const char *pathname, int flags);
Int open(const char *pathname, int flags, mode_t mode);
函数说明:
open:返回的文件描述符一定是最小的未被使用的描述符。
mode:如果文件不存在,是新建的,则可以利用mode设置文件权限。
pathname 指向欲打开的文件路径字符串。
flag 标志位:
下列是参数flags 所能使用的标志位:
O_RDONLY以只读方式打开文件
O_WRONLY以只写方式打开文件
O_RDWR以可读写方式打开文件。
上述三种标志位是互斥的,也就是不可同时使用,但可与下列的标志位利用OR(|)运算符组合。
O_APPEND 每次写操作都写入文件的末尾
O_CREAT 如果指定文件不存在,则创建这个文件
O_EXCL 如果要创建的文件已存在,则返回-1,并且修改errno的值
O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向FIFO/块文件/字符文件,则把文件的打开和后继I/O设置 为非阻塞模式
O_CREAT 若欲打开的文件不存在则自动建立该文件。
O_EXCL 如果O_CREAT也被设置,此指令会去检查文件是否存在。文件若不存在则建立该文件,否则将导致打开文件错误。此外,若O_CREAT与O_EXCL同时设置,并且欲打开的文件为符号连接,则会打开文件失败。
O_NOCTTY 如果欲打开的文件为终端机设备时,则不会将该终端机当成进程控制终端机。
O_TRUNC 若文件存在并且以可写的方式打开时,此标志位会令文件长度清为0,而原来存于该文件的资料也会消失。
O_APPEND 当读写文件时会从文件尾开始移动,也就是所写入的数据会以附加的方式加入到文件后面。
O_NONBLOCK以不可阻断的方式打开文件,也就是无论有无数据读取或等待,都会立即返回进程之中。
O_NDELAY同O_NONBLOCK。
O_SYNC以同步的方式打开文件。
O_NOFOLLOW如果参数pathname所指的文件为一符号连接,则会令打开文件失败。
O_DIRECTORY如果参数pathname所指的文件并非为一目录,则会令打开文件失败。
1.Read
定义函数
ssize_t read (int fd, void *buf, size_t count);
返回值
成功返回读取的字节数,出错返回-1并设置errno,如果在调read之前已到达文件末尾,则这次read返回0。
参数
参数fd是文件描述符。
参数count是请求读取的字节数,
读上来的数据保存在缓冲区buf中,
同时文件的当前读写位置向后移。注意这个读写位置和使用C标准I/O库时的读写位置有可能不同,这个读写位置是记在内核中的,而使用C标准I/O库时的读写位置是用户空间I/O缓冲区中的位置。
read函数返回时,返回值说明了buf中前多少个字节是刚读上来的。有些情况下,实际读到的字节数(返回值)会小于请求读的字节数count,例如:读常规文件时,在读到count个字节之前已到达文件末尾。例如,距文件末尾还有30个字节而请求读100个字节,则read返回30,下次read将返回0。
2.Write
write函数所在的头文件为 <unistd.h>
ssize_t write (int handle, void *buf, int nbyte);
handle 是文件描述符;
buf 是指定的缓冲区,即指针,指向一段内存单元;
nbyte 是要写入文件指定的字节数;返回值:返回写入文档的字节数(成功);返回-1(出 错)
Write 函数把buf中nbyte写入文件描述符handle所指的文档,成功时返回写的字节数,错误时返回-1.
3.lseek
头文件:#include <sys/types.h>
#include <unistd.h>
用 法: off_t lseek (int handle, off_t offset, int fromwhere);
参数fildes 为已打开的文件描述符,参数offset 为根据参数whence来移动读写位置的位移数。
whence为下列其中一种:(SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2).
SEEK_SET 将读写位置指向文件头后再增加offset个位移量。
SEEK_CUR 以目前的读写位置往后增加offset个位移量。
SEEK_END 将读写位置指向文件尾后再增加offset个位移量。
当whence 值为SEEK_CUR 或SEEK_END时,参数offet允许负值的出现。
每个打开的文件都有一个与其相关连的“当前文件偏移量”( current file offset )。它通常是一个非负整数,用以度量从文件开始处计算的字节数。通常,读、写操作都从当前文件偏移量开始,并使偏移量增加所读写的字节数。按系统默认情况,当打开一个文件时,除非指定 O_APPEND 选项,否则该偏移量设置为 0。
lseek调用仅将当前的文件偏移量记录在内核中,它并不引起任何的 I/O 操作。然后,该偏移量用于下一个读或写操作。
4.lstat()
#include <sys/stat.h>
函数名: lstat
功 能: 获取一些文件相关的信息
用 法: int lstat (const char *path , struct stat *buf);
参数:
path:文件路径名。
buf:是以下结构体的指针
struct stat {
dev_t st_dev; /* 文件所在设备的标识 */
ino_t st_ino; /* 文件结点号 */
mode_t st_mode; /* 文件保护模式 */
nlink_t st_nlink; /* 硬连接数 */
uid_t st_uid; /* 文件用户标识 */
gid_t st_gid; /* 文件用户组标识 */
dev_t st_rdev; /* 文件所表示的特殊设备文件的设备标识 */
off_t st_size; /* 总大小,字节为单位 */
blksize_t st_blksize; /* 文件系统的块大小 */
blkcnt_t st_blocks; /* 分配给文件的块的数量,512字节为单元 */
time_t st_atime; /* 最后访问时间 */
time_t st_mtime; /* 最后修改时间 */
time_t st_ctime; /* 最后状态改变时间 */
};
返回说明编辑
成功执行时,返回0。失败返回-1,errno被设为以下的某个值
EBADF: 文件描述词无效
EFAULT: 地址空间不可访问
ELOOP: 遍历路径时遇到太多的符号连接
ENAMETOOLONG:文件路径名太长
ENOENT:路径名的部分组件不存在,或路径名是空字串
ENOMEM:内存不足
ENOTDIR:路径名的部分组件不是目录
6.dup2()
#include<unistd.h>
Int dup2(int old_fd ,int new_fd);
功能:
复制一个现有的文件描述符。
如果new_fd已经打开,则先将其关闭,若new_fd = old_fd,则dup2返回new_fd而不将其关闭。否则,new_fd的FD_CLOSEEXEC文件描述符标志就被清除,调用exec时是打开状态。
7.creat
#include<fcntl.h>
int creat(const char *filename, mode_t mode)
filename:要创建的文件名(包含路径,缺省为当前路径)
mode:创建模式
常见创建模式:(也可以用数字代替以下宏)
S_IRUSR 可读 ->1
S_IWUSR 可写 ->2
S_IXUSR 可执行 ->4
S_IRWXU 可读、可写、可执行 ->7
无任何权限 ->0
创建成功则返回一个文件描述符,否则返回一个小于0的数
eg:
fd=creat(“file”,777);
8.access
#include <stdio.h>
#include <unistd.h>
int access(const char * pathname,int mode)
功能:
判断文件可以操作的权限
pathname:需要检测的文件路劲名
mode:需要测试的权限模式:
R_OK 可读
W_OK 可写
X_OK 可执行
返回值:
测试成功,满足操作权限返回0,否则返回-1