给文件创建硬链接
sudo ln a.c a.hard
下面使用link函数创建硬链接的功能
int link(const char *oldpath,const char *newpath);
实现mv的功能:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
link(argv[1],argv[2]);
unlink(argv[1]);
return 0;
}
unlink函数删除硬链接文件
unlink函数
删除一个文件的目录项:
int unlink(const char *pathname);
成功:0;
失败:-1;
设置errno为相应值
练习:编程实现mv命令的改名操作
注意Linux下删除文件的机制:不断将st_link -1,直至减为零为止,无目录项对应的文件,将会被操作系统择机释放。(具体时间由系统内部调度算法决定)
因此,我们删除文件,从某种意义上说,只是让文件具备了被释放的条件。
unlink函数的特征:清除文件时,如果文件的硬链接数到0了,没有dentry(目录项)对应,但该文件仍不会马上被释放。要等到所有打开该文件的进程关闭该文件,系统才会挑时间将该文件释放掉。
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
int fd,ret;
char *p = "test of unlink\n";
char *p1 = "after write something.\n";
fd = open("temp.txt",O_RDWR|O_CREAT|O_TRUNC,0777);
if(fd < 0)
{
perror("open temp error");
exit(1);
}
ret = write(fd,p,strlen(p));//往temp.txt里面写东西
if(ret == -1)
{
perror("-------write error");
}
printf("hi! I'm printf\n");
ret = write(fd,p1,strlen(p1)); //往temp.txt里面写东西
if(ret == -1)
{
perror("-------write error");
}
printf("Enter anykey continue\n");
getchar(); //阻塞作用
close(fd);
ret = unlink("temp.txt"); //到了这一步删除temp.txt文件
if(ret < 0)
{
perror("unlink error");
exit(1);
}
return 0;
} 1,8 Top
在文件写入前删除文件
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
int fd,ret;
char *p = "test of unlink\n";
char *p1 = "after write something.\n";
fd = open("temp.txt",O_RDWR|O_CREAT|O_TRUNC,0777);
if(fd < 0)
{
perror("open temp error");
exit(1);
}
ret = unlink("temp.txt");
if(ret < 0)
{
perror("unlink error");
exit(1);
}
ret = write(fd,p,strlen(p));
if(ret == -1)
{
perror("-------write error");
}
printf("hi! I'm printf\n");
ret = write(fd,p1,strlen(p1));
if(ret == -1)
{
perror("-------write error");
}
printf("Enter anykey continue\n");
getchar();
p[1]='a';
close(fd);
return 0;
}
把内容放到了缓冲区中,等进程结束了就释放了。
隐式回收
当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。系统的这一特性称之为隐式回收系统资源。
symlink函数
创建一个符号链接
int symlink(const char *oldpath,const char *newpath);
成功:0;
失败:-1
设置errno为相应值
创建软连接
sudo ln -s test t.soft
读符号链接文件本身
readlink函数
读取符号链接文件本身内容,得到链接所指向的文件名。
ssize_t readlink(const char *path,char *buf,size_t bufsize);
成功:0
失败:-1
设置errno为相应值
rename函数
重命名一个文件。
int rename(const char *oldpath,const char *newpath);
成功:0
失败:-1
设置errno为相应值
文件目录rwx权限差异
sudo chmod a-x unlink.c
删除执行权限(x)
opendir函数
根据传入的目录名打开一个目录(库函数)
DIR *opendir(const char name);
成功返回指向该目录结构体指针
失败返回NULL
参数支持相对路径、绝对路径两种方式:例如:打开当前目录:①getcwd(),opendir()
②opendir(".");(库函数)
closedir函数
需要包含头文件#include <dirent.h>
函数原型:
int closedir(DIR *dirp);
readdir函数
函数原型:
struct dirent *readdir(DIR *dirp);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
int main(int argc,char *argv[])
{
DIR *dp;
struct dirent *sdp;
dp = opendir(argv[1]);
if(dp == NULL)
{
perror("opendir error");
exit(1);
}
while((sdp=readdir(dp))!=NULL)
{
printf("%s\t",sdp->d_name); //读取到的名字
}
printf("\n");
closedir(dp);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <dirent.h>
int main(int argc,char *argv[])
{
DIR *dp;
struct dirent *sdp;
dp = opendir(argv[1]);
if(dp == NULL)
{
perror("opendir error");
exit(1);
}
while((sdp=readdir(dp))!=NULL)
{
if(strcmp(sdp->d_name ,".") == 0) //读取文件名,当.的时候,继续执行循环
continue;
else if(strcmp(sdp->d_name ,"..") == 0) //
continue;
printf("%s\t",sdp->d_name);
}
printf("\n");
closedir(dp);
return 0;
}