目录
扫描二维码关注公众号,回复:
16307519 查看本文章
stat
获取文件属性。同时会穿透符号链接。
man 2 stat
参数path
文件名或文件路径。
参数buf
inode结构体指针。
返回值
成功:0
失败:-1
测试代码1
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
struct stat sbuf;
int flag = stat(argv[1], &sbuf);
if (flag == -1)
{
perror("star error");
exit(1);
}
printf("st_size:%ld\n", sbuf.st_size); //输出文件的大小
return 0;
}
测试结果
lstat
获取文件属性。不会穿透符号链接,能够查看文件是否为软链接文件。
man 2 lstat
参数path
文件名或文件路径。
参数buf
inode结构体指针。
返回值
成功:0
失败:-1
测试代码2
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
struct stat sbuf;
int flag = lstat(argv[1], &sbuf);
if (flag == -1)
{
perror("star error");
exit(1);
}
if (S_ISREG(sbuf.st_mode))
{
printf("这是个普通文件\n");
}
else if (S_ISDIR(sbuf.st_mode))
{
printf("这是个目录\n");
}
else if (S_ISLNK(sbuf.st_mode))
{
printf("这是一个软链接\n");
}
return 0;
}
测试结果
link
创建硬链接。
man 2 link
unlink
删除除一个文件的目录项。Linux下删除文件,不断将st_nlink-1,直至减到0为止。无目录项对应的 文件,将会被操作系统择机释放,具体时间由系统内部调度算法决定。删除文件时,从某种意义上说,只是让文件具备了被释放的条件。
unlink清除文件时,如果文件的硬链接数到0了,没有dentry对应,但该文件仍不会马上被释放。要等到所有打开该文件的进程关闭该文件,系统才会挑时间将该文件释放掉。
man 2 unlink
测试代码3
//文件的重命名
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
int main(int argc, char *argv[])
{
link(argv[1],argv[2]);
unlink(argv[1]);
return 0;
}
测试结果
测试代码4
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main()
{
int fd, flag;
char *str = "NiHao,ShiJie.\n";
fd = open("temp.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
if (fd < 0)
{
perror("open error");
}
flag = unlink("temp.txt");
if (flag < 0)
{
perror("unlink error");
exit(1);
}
printf("unlink ok\n");
flag = write(fd, str, strlen(str));
if (flag < 0)
{
perror("write error");
}
printf("write ok!\n");
getchar();
close(fd);
return 0;
}
测试结果
unlink成功删除,但是write还是成功执行,因为temp.txt在缓存区里保存着。
隐式回收
当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。防止系统内存被占满。