之前一直对Linux的文件类型中的 “l” 类型的了解不是很深入,最近经过“圣经”指点,略知一二,在此先记录一下,以便以后查阅,之后会对文件和目录、文件I/O这部分再扩充。

首先需明确,Unix在查阅文件类型时,首先调用的是stat函数,格式如下:

 int  stat(const char *restrict pathname , struct stat *restrictbuf)

   成功则返回0(出错返回-1),得到7种文件类型如下:

1.普通文件 (-)

2.目录文件 (d)

3.块特殊文件 (b)

4.字符特殊文件 (c)

5.FIFO (用于进程间通信,也叫命名管道 )

6.套接字 (socket)

7.符号链接 (l)

平时我们新手接触最多的就是普通文件以及目录文件,同时也会接触到标志为“l”的文件,在此先介绍硬链接和软链接。

硬链接实际上是一个指针,指向源文件的inode,系统并不为它重新分配inode。任何一个文件可以有多个目录项指向其inode,硬链接不会产生新的inode,硬连接不管有多少个,都指向的是同一个inode节点,只是新建一个hard link会把结点连接数增加,只要结点的连接数不是0,文件就一直存在,不管你删除的是源文件还是连接的文件。只要有一个存在,文件就存在(其实就是引用计数的概念)。当你修改源文件或者连接文件任何一个的时候,其他的文件都会做同步的修改。(引自http://blog.csdn.net/yasaken/article/details/7292186)。此时,我们可以试一下,找一个占用磁盘大一些的测试文件,,然后ln建立一个hard link,发现此时该文件的类型就是普通文件,如下图,而且占用同样大的磁盘空间,当我随便去试图修改一个文件时,由于这些硬链接文件指向同一个inode,因此所有文件都做出同步的修改,该文件的链接计数为2,当我们unlink随便一个文件时,链接计数减一,则只删去unlink路径下的那个硬链接文件,实际的文件并没有删除。

通过以上的实验,我个人认为是否可以将硬链接看成是cp一个文件,答案是否定的,因为cp需要占用新的inode节点,并且占用新的磁盘空间,两份文件完全独立开来,而硬链接是创建同一个block的连接,数据只有一份,只不过是有多个inode的关联记录而已,(注意:hard
link只能指向自己文件系统的inode,无法跨越文件系统。如果要想实现支持创建指向一个目录的硬链接,那么也仅限于root,这其实是不被推荐的,容易在文件系统中形成循环。POSIX.1常量LINK_MAX指定了一个文件链接数的最大值为8.)。link 函数以及linkat函数调用方式如下:

int  link (const char *existingpath,  const char *newpath);

   int  linkat (int efd, const char *exsitingpath, int nfd, const char *newpath, int
flag);

   软链接最直观的解释:相当于Windows系统的快捷方式,是一个独立文件(拥有独立的inode,与源文件inode无关),该文件的内容是源文件的路径指针,通过该链接可以访问到源文件。所以删除软链接文件对源文件无影响,但是删除源文件,软链接文件就会找不到要指向的文件(可以类比Windows上快捷方式,你点击快捷方式可以访问某个文件,但是删除快捷方式,对源文件无任何影响)。命令可以用:ln
 -s   源文件的绝对路径   软链接文件的绝对路径

在此注意,指定路径时,一定要指定绝对路径,否则会出现找不到链接的源文件的情况。如下图:软链接已经建立,但是无法通过软链接打开源文件。如果不使用绝对路径的话,就要在脚本中调用linkat函数,通过设置文件描述符efd和nfd的标志为AT_FDCWD(强制通过相对于调用进程的当前目录计算pathname),与相对路径来计算文件的路径(目前我还没有涉及到)。

由于软链接文件与源文件的inode无关,所以是可以跨越文件系统的。同时,软链接的操作权限是777的,但是如果你要对此进行编辑,需要的权限是源文件的权限,而硬链接的操作权限与源文件保持一致。

下面说一下由此引发的对unlink的一点记录。

为了删除一个现有的目录项,可以调用unlink函数,如下:

int  unlink (const char *pathname);

int  unlinkat (int fd ,const char *pathname, int flag);

当我们要想删除一个文件时,必须要具备两个条件:

1.链接计数达到0,该文件才可以被删除。

2.只要有进程打开了文件,其内容也不能删除。

如下面一段代码:

int
main(void)
{
if (open("tempfile", O_RDWR|O_CREAT) < 0)
err_sys("open error");
if (unlink("tempfile") < 0)
err_sys("unlink error");
printf("file unlinked\n");
sleep(15);
printf("done\n");
exit(0);
}

当我们执行unlink后,虽然计数为0,实际上并没有将文件删除,而是要经过15秒后的exit(0)使进程调用关闭后,才真正的删除了该文件,正是那句printf让我纠结了大半天。  具体的执行exit(0)做的东西以后再扩充。

从symbol link和hard link 到 unlink函数的一点记录的更多相关文章

  1. Symbolic link and hard link的区别(linux)

    --Symbolic link and hard link的区别(linux) --------------------------------------------------2014/06/10 ...

  2. Expo大作战(八)--expo中的publish以及expo中的link,对link这块东西没有详细看,大家可以来和我交流

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  3. 菜鸟学Linux - Hard Link与Symbolic Link

    在学习Hard Link与Symbolic Link之前,需要大概了解一下inode与data block.在Linux的文件系统中,一个文件对应一个inode与若干个data block.inode ...

  4. PHP unlink() 函数

    定义和用法 unlink() 函数删除文件. 若成功,则返回 true,失败则返回 false. 语法 unlink(filename,context) 参数 描述 filename 必需.规定要删除 ...

  5. PHP unlink()函数,删除文件

    定义和用法 unlink() 函数删除文件. 若成功,则返回 true,失败则返回 false. 语法 unlink(filename,context) 参数 描述 filename 必需.规定要删除 ...

  6. php unlink()函数使用

    最近在写个网站,需要上传图片,如果修改图片,就图片就没有用了,会占用服务器的硬盘资源,所以想到用unlink函数删除旧照片. 问题 : unlink函数只能删除 相对于函数执行文件的相对目录  或  ...

  7. PHP unlink() 函数(删除文件)

    PHP unlink() 函数(删除文件) 一.总结 unlink() 函数删除文件. 1.实例 $file = "test.txt"; if (!unlink($file)) 2 ...

  8. CSS教程:vlink,alink,link和a:link

    超链接文字的状态可以通过伪类选择符+样式规则来控制. 一组专门的预定义的类称为伪类,主要用来处理超链接的状态.超链接文字的状态可以通过伪类选择符+样式规则来控制.伪类选择符包括: 总: a 表示 超链 ...

  9. VC中LINK 2001 和 LINK 2009 的错误的解决

    最近将两个开源C++项目编译成windows版本的时候遇到很多问题,关键是两个项目经过同事的修改之后,一个项目引用了另一个项目,两个项目的头文件中都有一些跨平台的关于数据类型,以及一些通用函数的定义, ...

随机推荐

  1. HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】

    火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起(包括第3站 ...

  2. JSP-Servlet-SpringMVC

    作者:码思客链接:https://zhuanlan.zhihu.com/p/37612412来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本篇文章,我们来讲讲技术,系 ...

  3. 洛谷1373小a和uim之大逃离

    题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...

  4. delphi 按位运算 not and or xor shl shr

    delphi 按位运算 not and or xor shl shr unit Unit1;   interface   uses   Windows, Messages, SysUtils, Var ...

  5. Android Touch事件传递机制详解 下

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38025165 资源下载:http://download.csdn.net/detail/yu ...

  6. Oracle Form's Trigger Tutorial With Sample FMB

    Created an Oracle Form to handle specific events / triggers like When-New-Form-Instance, Pre-Insert, ...

  7. EasyMvc入门教程-基本控件说明(8)提醒导航

    提醒导航顾名思义就是提醒大家注意某些文字了..请看下面的例子: 实现代码如下: @Html.Q().BlockRemind().Text("我可以作为提醒使用") 有的同学会说:这 ...

  8. logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统

    logback MDC(Mapped Diagnostic Context)与分布式系统的跟踪系统 logback官方文档中第8章Mapped Diagnostic Context给我们提供了一些分布 ...

  9. 深入Java----集合----BitSet

    BitSet类    大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. java中有三种移位运算符 <<      :     左移运算符,num <&l ...

  10. JAVA学习第十四课(接口:implements及其基本应用)

    接口: 我们知道抽象类中能够定义抽象方法,也能够定义非抽象方法.当一个抽象类中的方法都是抽象方法的时候,我们就能够定义还有一种表现方式:接口(interface),所以接口是一种特殊的抽象类 接口的出 ...