open()
函数作用:打开文件path,进行oflags操作。返回文件path的文件描述符。如果两个程序同时打开一个文件,将得到两个不同的文件描述符。
头文件: #include "fcntl.h"
函数原型:int open(const char* path,int oflags);或int open(const char* path,int oflags, mode_t mode);
函数返回值:返回-1时代表函数出错,错误代码保存在全局变量errno中。
oflags参数是通过必需文件访问模式与其他可选模式相结合的方式来指定的。open调用必须使用文件访问模式之一。
文件访问模式:
模式 说明
O_RDONLY 以只读方式打开
O_WRONLY 以只写方式打开
O_RDWR 以读写方式打开
可选模式:
模式 说明
O_APPEND 把写入数据追加在文件的末尾
O_TRUNC 把文件长度设置为0,丢弃已有的内容
O_CREAT 如果需要,就按参数mode中给出的访问模式创建文件
O_EXCL 与O_CREAT一起使用,确保调用者创建出文件
使用O_CREAT标志的open调用创建文件时,open函数接受第三个参数mode
模式 说明
S_IRUSR 读权限,文件属主
S_IWUSR 写权限,文件属主
S_IXUSR 执行权限,文件属主
S_IRGRP 读权限,文件所属组
S_IWGRP 写权限,文件所属组
S_IXGRP 执行权限,文件所属组
S_IROTH 读权限,其他用户
S_IWOTH 写权限,其他用户
S_IXOTH 执行权限,其他用户
close()
头文件: #include "unistd.h" //#include "unistd.h"必须首先出现,因为它定义的与POSIX规范有关的标志可能影响其他头文件。
read()
头文件: #include "unistd.h"
函数原型: size_t read(int fildes, void* buf, size_t nbytes);
函数作用: 从文件fildes读入nbytes个字节的数据,放入数据区buf中。返回实际读入的字节数,可能会小于nbytes。
函数返回: 返回0,表示未读入任何数据;返回-1,在调用中出现了错误。
write()
头文件: #include "unistd.h"
函数原型: size_t write(int fildes, const void* buf, size_t nbytes);
函数作用: 把缓冲区buf的前nbytes个字节写入文件fildes。返回实际写入的字节数,可能会小于nbytes。
函数返回: 返回0,表示未写入任何数据;返回-1,在调用中出现了错误,错误代码保存在全局变量errno中。
ioctl()
头文件: #include "unistd.h"
函数原型: int ioctl(int fildes, int cmd, ...);
函数作用: 针对描述符fildes执行cmd参数给出的操作。根据操作的不同,可能有第三参数。
lseek()
头文件: #include "unistd.h"
#include "sys/types"
函数原型: off_t lseek(int fildes, off_t offset, int whence);
返回值: lseek返回从文件头到文件指针被设置处的字节偏移值,失败时返回-1.参数offset的类型off_t是一个与具体实现有关的整数。
offset参数指定位置,whence参数定义该偏移值的用法。
whence可以取下列值之一:
SEEK_SET:offset是一个绝对位置
SEEK_CUR:offset是一个相对于当前位置的一个相对位置
SEEK_END:offset是一个相对于文件尾的一个相对位置
fstat() stat() lstat()
头文件: #include "unistd.h"
#include "sys/stat.h"
#include "sys/types"
函数原型: int fstat(int fildes, struct stat* buf);
int stat(const char * path, struct stat* buf)
int lstat(const char* path, struct stat* buf)
函数作用: fstat系统调用返回打开的文件描述符相关的文件的状态信息,该信息将写到一个buf结构中。
相关函数stat和lstat返回的是通过文件名查到的状态信息,它们产生相同的结果。但当文件是一个符号链接时,lstat返回的是该符号链接本身的信息,而stat返回的是该链接指向的文件的信息。
stat结构的成员:
stat成员 说明
st_mode 文件权限和文件类型信息
st_ino 与该文件关联的mode
st_dev 保存文件的设备
st_uid 文件属主的UID号
st_gid 文件属主的GID号
st_atime 文件上一次被访问的时间
st_ctime 文件的权限、属主、组或内容上一次被改变的时间
st_mtime 文件的内容上一次被修改的时间
st_nlink 该文件上硬链接的个数
stat结构中返回的st_mode标志还有一些与之关联的宏,这些宏包括对访问权限、文件类型标志以及一些用于帮助测试特定类型和权限的掩码的定义。
文件类型标志如下:
文件类型标志 说明
S_IFBLK 文件是一个特殊的块设备
S_IFDIR 文件是一个目录
S_IFCHR 文件是一个特殊的字符设备
S_IFIFO 文件是一个FIFO(命名管道)
S_IFREG 文件是一个普通文件
S_FLNK 文件是一个符号链接
其他模式标志:
其他模式 说明
S_ISUID 文件设置了SUID位
S_ISGID 文件设置了SGID位
解释st_mode标志的掩码:
掩码 说明
S_IFMT 文件类型
S_IRWXU 属主的读写执行权限
S_IRWXG 属组的读写执行权限
S_IRWXO 其他用户的读写执行权限
确定文件类型的宏定义:
宏定义 说明
S_ISBLK 测试是否是特殊的块设备文件
S_ISCHR 测试是否是特殊的字符设备文件
S_ISDIR 测试是否是目录
S_ISFIFO 测试是否是FIFO
S_ISREG 测试是否是普通文件
S_ISLNK 测试是否是符号链接
测试一个文件代表的不是一个目录,设置了属主的执行权限,并且不再有其他权限
struct stat statbuf;
mode_t modes;
stat("filename", &statbuf);
modes = statbuf.st_mode;
if(!S_ISDIR(modes) && (modes & S_IRWXU) == S_IXUSR)
...
dup() dup2()
头文件: #include "unisted.h"
函数原型: int dup(int fildes); int dup2(int fildes, int fildes2);
访问权限:
有几个因素会对文件的访问权限产生影响:open调用给出的mode值与用户掩码umask
umask:当文件被创建时,为文件的访问权限设定一个掩码,确定文件访问权限的范围。它由3个八进制数组成,分别对应用户、组、其他用户的访问权限
数字 取值 含义
1 0 允许属主任何权限
4 禁止属主的读权限
2 禁止属主的写权限
1 禁止属主的执行权限
2 0 允许组任何权限
4 禁止属组的读权限
2 禁止属组的写权限
1 禁止属组的执行权限
3 0 允许其他用户的任何权限
4 禁止其他用户的读权限
2 禁止其他用户的写权限
1 禁止其他用户的执行权限
标准I/O库:
fopen()
头文件: #include "stdio.h"
函数原型: FILE* fopen(const char* filename, const char* mode);
mode参数:
mode 说明
“r”或"rb" 以只读方式打开 //字母b代表打开的是二进制文件
"w"或"wb" 以写方式打开,并把文件长度截断为0
"a"或"ab" 以写方式打开,新内容追加在文件尾
"r+"或"rb+"或"r+b" 以更新方式打开(读和写)
"w+"或"wb+"或"w+b" 以更新方式打开,并把文件长度截断为0
"a+"或"ab+"或"a+b" 以更新方式打开,新内容追加在文件尾
fread()
头文件: #include “stdio.h”
函数原型: size_t fread(void* ptr, size_t size, size_t nitems, FILE* stream);
fwrite()
头文件: #include “stdio.h”
函数原型: size_t fwrite(const void* ptr, size_t size, size_t nitms, FILE* stream);
fcolse()
头文件: #include “stdio.h”
函数原型: int fcolse(FILE* stream)
fflush()
头文件: #include “stdio.h”
函数原型: int fflush(FILE* stream) //作用是把文件流里所有未写出数据立刻写出,调用fclose隐含执行了一次fflush操作
fseek()
头文件: #include “stdio.h”
函数原型: int fseek(FILE* stream, long int offset, int whence);
fgetpos() //获得文件流的当前读写位置
fsetpos() //设置文件流的当前读写位置
ftell() //返回文件流当前读写位置的偏移值
rewind() //重置文件流里的读写位置
freopen() //重新使用一个文件流
setvbuf() //设置文件流的缓冲机制
remove() //相当于unlink函数,但如果参数是一个目录,就相当于rmdir
ferror() //检查文件是否发生了错误,返回非0既出错
函数原型: int ferror(FILE* stream)
feof() //测试是否抵达了文件尾,返回非0既到了文件尾
函数原型: int feof(FILE* stream)
clearerr() //清除文件尾标识和错误标识
函数原型: int clearerr(FILE* stream)
int fileno(FILE* stream) //返回文件流使用的文件描述符,出错返回-1
FILE* fdopen(int fildes, const char* mode) //操作方式等同fopen,失败返回null
getcwd() //把当前目录的名字写到缓冲区buf中,目录名长度超过了size,返回null
头文件: #include “unistd.h”
函数原型: char* getcwd(char* buf, size_t size)