#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>
#define BUFFER_SIZE 409600
int printfilestat(int fd, struct stat *buf) {
int results = fstat(fd, buf);
if (results == -1) {
perror("文件属性获取失败");
return -1;
}
printf("文件连接数是=%d\n", buf->st_nlink);
return 0;
}
int main() {
int fd = open("linkfile", O_RDWR, 0777);
if (fd == -1) {
perror("文件打开失败");
return -1;
}
struct stat buf;
printfilestat(fd, &buf);
if (link("linkfile", "newlinkfile") == 0) {
puts("链接文件创建成功");
}
printfilestat(fd, &buf);
if (unlink("newlinkfile") == 0) {
puts("newlinkfile文件删除成功");
}
printfilestat(fd, &buf);
if (unlink("linkfile") == 0) {
puts("linkfile文件删除成功");
}
printfilestat(fd, &buf);
sleep(30);
close(fd);
puts("关闭文件!");
sleep(-1);
return 0;
}
控制台输出
文件连接数是=1
链接文件创建成功
文件连接数是=2
newlinkfile文件删除成功
文件连接数是=1
linkfile文件删除成功
文件连接数是=0
è虽然文件连接数为0 但是文件数据没有被删除,需要等待所有进程都close该文件才会被从磁盘删除
tkf@tkf:~/workspace/FileOperator$ ll linkfile ;df ./
-rwxrwxr-x 1 tkf tkf 4096005月9 16:34linkfile*
文件系统1K-blocks已用可用已用% 挂载点
/dev/sda128768380 17972780931121266% /
执行程序
tkf@tkf:~/workspace/FileOperator$ df ./
文件系统1K-blocks已用可用已用% 挂载点
/dev/sda128768380 17972784931120866% /
linkfile, newlinkfile文件符号连接删除,因此可用资源变多了
sleep(30)
tkf@tkf:~/workspace/FileOperator$df ./
文件系统1K-blocks已用可用已用% 挂载点
/dev/sda128768380 17972344931164866% /
执行了close,因此在无进程来接到数据,所以文件数据被释放,可用资源再一次变多了
symlink|readlink
创建一个软链接
int symlink (constchar *__from, constchar *__to)
返回值:成功返回0,失败返回-1
打开软链接文件
ssize_t readlink (constchar *__restrict __path,
char *__restrict __buf, size_t __len)
返回值:成功返回0,失败返回-1
文件状态和属性
获取文件状态
Int fstat(文件标识符,struct stat *buf)
Int lstat(文件路径,struct stat *buf)
Int stat(文件路径,struct stat *buf)
文件路径:绝对路径与相对路径均可
文件标识符:文件创建或打开时返回的文件标示符
struct stat *buf:文件属性结构体
返回值:成功返回0,失败返回-1
说明:stat和lstat的区别:当文件是一个符号链接时,lstat返回的是该符号链接本身的信息;而stat返回的是该链接指向的文件的信息
stat 结构体成员意义
struct stat {
dev_t st_dev; 文件所在设备的ID
ino_t st_ino; 与该文件关联的inode
mode_t st_mode;
nlink_t st_nlink; /* 链向此文件的连接数(硬连接)*/
uid_t st_uid; 文件属主的UID号
gid_t st_gid; 文件属主的GID号
dev_t st_rdev; 设备号,针对设备文件
off_t st_size; 文件大小
blksize_t st_blksize; 系统块的大小(IO缓冲区适合大小)
blkcnt_t st_blocks; 文件所占块数
time_t st_atime;
time_t st_mtime;
time_t st_ctime;
}
st_mode 标志
文件类型标志:
S_IFBLK:文件是一个特殊的块设备
S_IFDIR:文件是一个目录
S_IFCHR:文件是一个特殊的字符设备
S_IFIFO:文件是一个FIFO设备
S_IFREG:文件是一个普通文件(REG即使regular啦)
S_IFLNK:文件是一个符号链接
其他模式标志:
S_ISUID: 文件设置了SUID位
S_ISGID:文件设置了SGID位
S_ISVTX:文件设置了SBIT位
用于解释st_mode标志的掩码:
S_IFMT:文件类型
S_IRWXU:属主的读/写/执行权限,可以分成S_IXUSR,S_IRUSR, S_IWUSR
S_IRWXG:属组的读/写/执行权限,可以分成S_IXGRP,S_IRGRP, S_IWGRP
S_IRWXO:其他用户的读/写/执行权限,可以分为S_IXOTH,S_IROTH, S_IWOTH
确定文件类型
S_ISBLK:测试是否是特殊的块设备文件
S_ISCHR:测试是否是特殊的字符设备文件
S_ISDIR:测试是否是目录(我估计find .-type d的源代码实现中就用到了这个宏)
S_ISFIFO:测试是否是FIFO设备
S_ISREG:测试是否是普通文件
S_ISLNK:测试是否是符号链接
S_ISSOCK:测试是否是socket
文件权限
umask
设置文件权限屏蔽字
mode_t umask (mode_t __mask)
chmod|lchmod|fchmod
设置文件权限
int chmod (constchar * file, __mode_tmode)
int lchmod (constchar * file, __mode_tmode)
int fchmod (int fd, mode_tmode)
chown|fchown|lchown
设置文件所属用户及用户组
int chown (constchar *__file, __uid_t __owner, __gid_t__group)
int fchown (int __fd, __uid_t __owner, __gid_t __group) _
int lchown (constchar *__file, __uid_t __owner, __gid_t __group)
目录操作
创建目录
Int mkdir(路径,权限)
路径:绝对路径相对路径均可
权限:以数字形式表示的权限
返回值:成功返回0,失败返回-1
进入|获取工作目录
进入工作目录
Int chdir(路径)
路径:绝对路径相对路径均可
返回值:成功返回0,失败返回-1
Int fchdir(intfiledes)
返回值:成功返回0,失败返回-1
获取工作目录
char *getcwd (char *__buf, size_t __size)
返回值:当前工作目录
子目录流操作
打开目录,获得子目录流指针
DIR*opendir(char *name)
读取子目录
structdirent* readdir((DIR *dirp)
返回子目录流里的当前位置
longint telldir(DIR* drip)
设置子目录流的当前数据项指针
voidseekdir(DIR* drip,long int loc)
关闭子目录流
DIR*opendir(DIR* drip)
删除目录或文件
删除目录:int rmdir(路径)
删除文件:int unlink(路径)
返回值:成功返回1,失败返回-1