系统文件函数
stat函数
指针如果没有const一般表示传出参数,如果加const表示传入参数
struct stat
dev_t st_dev
文件设备编号ino_t st_ino
节点
inode号是唯一的,每个inode节点的大小一般是128字节活着256字节,一般文件每2KB就设置一个inodemode_t st_mode
文件类型和存取权限,16bite,4bite文件类型 4bit特殊权限位 3*4bit访问权限nlink_t st_nlink
文件的硬链接数目uid_t st_uid
用户IDgid_t st_gid
组IDdev_t st_rdev
若文件为设备文件,则为其设备编号off_t st_size
文件字节数blksize_t st_blksize
块大小(文件系统的I/O缓冲区大小)blkcnt_t st_blocks
快数time_t st_atime
最后一次访问时间time_t st_mtime
最后一次修改时间time_t st_ctime
最后一次改变时间:指属性,包括访问,修改内容,修改类型等
stat
函数和lstat
函数的区别:对于软链接,前者是穿透(追踪)函数,后者是不穿透(不追踪)函数
access测试文件是否有某种权限
chmod 改变文件权限
可以使用第3章strtol
函数将字符串转化为数字
chown 改变文件所有者
可以查看passwd
文件(详见手册第5章)
truncate函数
文件的截取和拓展
#include <unistd.h>
#include <sys/types.h>int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);
多出来的方式仍然是以空洞的方式储存
link函数
创建硬链接
#include <unistd.h>int link(const char *oldpath, const char *newpath);#include <fcntl.h> /* Definition of AT_* constants */
#include <unistd.h>int linkat(int olddirfd, const char *oldpath,int newdirfd, const char *newpath, int flags);
symlink 函数
创建软链接
readlink 函数
读一个软链接
unlink 函数
如果是软链接,则删除软链接
如果是硬链接,则删除当前硬链接,硬链接数减一,当减为0时,释放数据块和inode
使用unlink可以制作临时文件:如果文件硬链接数为0,但有进程已经打开文件,并且持有文件描述符,则等该进程关闭文件时kernel才真正删除文件,因此可以先open|creat一个文件,然后再使用文件描述符操作该文件,同时使用unlink
函数删去,则创造出了一个临时文件
每一次unlink
其实是删除一个目录项(denty),当所有占用该文件的进程使用结束或者进程关闭文件才会失效
操作文件的时候需要注意文件指针,尤其是写操作以后想要读取的时候
rename函数
目录操作函数
chdir函数
相当于cd命令,改变的是所在进程的路径,而不是终端的路径
getcwd函数
相当于pwd命令,获取进程当前目录
mkdir函数
需要注意创建的目录需要有执行权限,否则无法进入目录
rmdir函数
删除一个空目录
opendir函数(下面开始变成手册第三章的函数了)
成功返回一个DIR
指针,失败返回NULL
readdir函数
读取目录内容,返回一个结构体struct dirent
ino_t ino
目录的inodeff_t d_off
目录文件开头到此目录进入点的位移signed short int d_reclen
d_name的长度unsigned char d_type
文件的类型
closedir函数
dup 和dup2
查阅手册第二章
用于复制文件描述符,可以让多个文件描述符指向同一个文件
dup(old fd)
函数:返回一个文件描述符,指向旧文件描述符所指向的文件,返回的是所有未占用的文件描述符中最小的一个
dup2(old fd,new fd)
函数:指向新的文件描述符,如果新文件描述符原本指向一个文件则将该文件释放,再指向旧文件描述符所指向的文件。如果new和old是同一个文件描述符则不会关闭。
虽然可能有多个文件描述符,但是只有一个文件指针
这里的文件覆盖并不是清空,而是在原来文件上面写
fcntl函数
改变已经打开的文件的属性
- 复制一个现有的文件描述符
- 获得/设置文件描述符标记
- 获得/设置文件状态标记
int fcntl(int fd,,int cmd,long arg)
cmd=F_GETFL
,arg=0
就可以,返回文件的状态flag=fcntl(fd,F_GETFL,0)
cmd=F_SETFL
,arg=flag|O_APPEND/O_NONBLOCK
O_APPEND
在末尾追加
- 获得/设置异步I/O所有权
- 获得/设置记录锁