文件I/O系统调用
除了open、close、write、read这四个基本的低级文件I/O以外,其它的低级文件I/O如下:
- lseek
- fstat
- stat
- lstat
- dup
lseek系统调用
lseek用于设置将要读写文件的位置。相当于有一个指针,当指针指向文件内容的某一个位置时,下一次读写操作就会在文件的该位置进行。对文件进行读写操作时,该文件指针会不断地自动变化,而lseek就是指定该指针的位置。
>> lseek函数原型如下:
#include <unistd.h>
#include <sys/types.h>
off_t lseek(int fildes, off_t offset, int whence);
>> 函数的返回值: 当调用成功时,lseek就会返回从文件头到文件读写指针所在位置的 字节 偏移值;若调用失败则返回-1。
>> 函数的参数:
- int fildes指的就是要进行读写操作的文件所对应的文件描述符
- off_t offset参数是文件读写指针的偏移值,即用于指定文件操作的位置
- int whence可以指定偏移值的用法
>> 偏移值参数offset的用法:
offset的用法由参数whence来决定:
whence的值 | 说明 |
---|---|
SEEK_SET | offset是一个绝对位置 |
SEEK_CUR | offset是相对于当前位置的一个相对位置 |
SEEK_END | offset是相对于文件尾的一个相对位置 |
* 注:off_t类型定义于头文件<sys/types.h>中,是一个整数类型。
fstat系统调用
fstat系统调用可以获取一个文件的状态信息,它会将该信息写入到一个叫 struct stat 的结构中。
>> fstat的原型如下:
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int fstat(int fildes, struct stat *buf)
>> 函数的返回值: 调用成功时返回0,若失败则返回-1。
>> 函数的参数:
- int fildes指的是一个文件所对应的文件描述符
- struct stat *buf就是一个指向stat结构的指针,所指向的结构用于存放文件的信息
>> 关于stat结构:
stat成员 | 说明 |
---|---|
st_mode | 文件权限和文件类型信息 |
st_ino | 与该文件关联的inode |
st_dev | 保存文件的设备 |
st_uid | 文件属主的UID号 |
st_gid | 文件属主的GID号 |
st_atime | 文件上一次被访问的时间 |
st_ctime | 文件的权限、属主、组或内容上一次被改变的时间 |
st_mtime | 文件的内容上一次被修改的时间 |
st_nlink | 该文件上硬链接的个数 |
stat和lstat系统调用
stat和lstat系统调用的作用与fstat一样,但它们传入的参数不是文件描述符,而是文件的路径。
>> 函数接口如下:
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
这两个函数还有一个区别:当文件是一个符号链接时,lstat返回的是符号链接本身的信息;而stat函数返回的是该链接指向的文件的信息。
dup和dup2系统调用
dup/dup2函数的作用都是复制文件描述符,通过它们可以让一个文件拥有多个文件描述符。