文件链接函数ITeye - 威尼斯人

文件链接函数ITeye

2019年03月27日12时54分30秒 | 作者: 雁桃 | 标签: 文件,链接,函数 | 浏览: 1184

  依据中的介绍,任何一个文件都能够有多个目录项指向其 i 节点。创立一个指向现有文件的链接的办法是运用 link 函数或 linkat 函数(创立新目录项和添加链接计数是一个原子操作)。
#include unistd.h 
int link(const char *existingpath, const char *newpath);
int linkat(int efd, const *existingpath, int nfd, const char *newpath, int flag);
 /* 回来值:若成功,都回来 0;不然,都回来 -1 */

  两个函数都创立一个新目录项 newpath,它引证现有文件 existingpath。假如 newpath 现已存在,则回来犯错。
  关于 linkat 函数,现有文件是经过 efd 和 existingpath 参数指定的,新的路径名是经过  nfd 和 newpath 参数指定的。默许情况下,假如两个路径名中的任一个是相对路径,那么它需求经过相关于对应的文件描述符进行核算。假如两个文件描述符中的任一个设置为 AT_FDCWD,那么相应的路径名(假如它是相对路径)就经过相关于当时目录进行核算。假如任一路径名是肯定路径,相应的文件描述符参数就会被疏忽。当现有文件是符号链接时,由flag 参数来操控 linkat 函数是创立指向现有符号链接的链接仍是指向其所指向的文件的链接。假如 flag 参数中设置了 AT_SYMLINK_FOLLOW 标志,就创立指向符号链接方针的链接。不然就创立一个指向符号链接自身的链接。
  留意,许多文件体系完成不允许创立关于目录的硬链接,避免在文件体系中构成循环。
  为删去一个现有的目录项,能够调用 unlink 或 unlinkat 函数。
#include unistd.h 
int unlink(const char *pathname);
int unlinkat(int fd, const char *pathname, int flag);
 /* 回来值:若成功,都回来 0;不然,都回来 -1 */

  这两个函数删去目录项,并将由 pathname 所引证的文件的链接计数减 1。假如对该文件还有其他链接,则仍可经过其他链接拜访该文件。假如犯错,则不对该文件做任何更改。
  假如 pathname 参数是相对路径名,那么 unlinkat 函数核算相关于由 fd 文件描述符参数代表的路径名。假如 fd 设置为 AT_FDCWD,那么经过相当于调用进程的当时工作目录来核算路径名(除非 pathname 是肯定路径名)。当 flag 参数设置为 AT_REMOVEDIR 标志时,unlinkat 函数可类似于 rmdir 相同删去目录。不然履行与 unlink 相同的操作。
  为了免除对文件的链接,有必要对包括该目录项的目录具有写和履行权限。假如对该目录设置了粘着位,则对该目录具有写权限,而且还要具有下面三个条件之一:
  1、具有该文件。
  2、具有该目录。
  3、具有超级用户权限。
  只有当链接计数变为 0 时,该文件的内容才可被删去。此外,当有进程翻开了该文件时,其内容也不能删去。封闭一个文件时,内核首要查看翻开该文件的进程个数,假如这个计数为 0,内核再去查看其链接计数,假如也是 0,那么就删去该文件的内容。
  下面这个程序翻开一个文件,之后马上免除它的链接,然后履行该程序的进程睡觉 15 秒,接着停止。
#include stdio.h 
#include stdlib.h 
#include fcntl.h 
#include unistd.h 
int main(void){
 if(open("tempfile", O_RDWR) 0){
 printf("open error\n");
 exit(1);
 if(unlink("tempfile") 0){
 printf("unlink error\n");
 exit(1);
 printf("*** file unlinked\n");
 sleep(15);
 printf("done\n");
 exit(0);

  运转成果:
$ ls -l tempfile
-rw-r- 1 sar 413265408 Jan 21 07:14 tempfile
$ df /home # 查看可用磁盘空间
Filesystem 1K-blocks Used Available Used Mounted on
/dev/hda4 11021440 1956332 9065108 18% /home
$ ./unlinkDemo.out # 在后台运转程序
1364 # 进程 ID
*** file unlinked # 免除了文件链接
$ ls -l tempfile
ls:tempfile: No such file or directory # 目录项已被删去
$ df /home # 查看可用磁盘空间的改变
Filesystem 1K-blocks Used Available Used Mounted on
/dev/hda4 11021440 1956332 9065108 18% /home
done # 程序履行完毕,封闭一切翻开文件
$ df /home # 现在应当有更多可用的磁盘空间
Filesystem 1K-blocks Used Available Used Mounted on
/dev/hda4 11021440 1552352 9469088 15% /home

  unlink 的这种特性经常被用来保证即使是在程序溃散时,它所创立的临时文件也不会遗留下来。进程用 open 或 creat 创立一个文件,然后当即调用 unlink,由于该文件仍旧是翻开的,所以不会被当即删去,只有当进程封闭该文件或停止时(此刻内核会封闭该进程所翻开的悉数文件),该文件的内容才被删去。
  假如 pathname 是符号链接,那么 unlink 删去该符号链接,而不是所引证的文件。给出符号链接名的情况下,没有一个函数能删去由该链接所引证的文件。
  别的,也可用 remove 函数免除对一个文件或目录的链接。关于文件,remove 的功用与 unlink 相同;关于目录,remove 的功用同 rmdir。
#include stdio.h 
int remove(const char *pathname);
 /* 回来值:若成功,回来 0;不然,回来 -1 */

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表威尼斯人立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    文件链接函数ITeye

    文件,链接,函数
  • 3

    centos 布置ITeye

    装置,数据库,修正
  • 4
  • 5

    ubuntu 虚拟化 virt指令ITeye

    虚拟机,虚拟,办理
  • 6
  • 7

    linux 指令ITeye

    指令,供给,特定
  • 8

    linux封闭sendmail效劳ITeye

    封闭,效劳,发动
  • 9
  • 10

    mac解压缩指令大全ITeye

    紧缩,文件,指令