符号链接

符号链接的用途

符号链接是对一个文件的间接指针,它与前面介绍的硬连接不同,硬连接指向文件的i节点。引入符号链接是为了避开硬连接的一些限制:

  • 硬链接通常要求链接和文件位于同一文件系统中。
  • 只有超级用户才能创建指向目录的硬链接(在底层文件系统支持的情况下)。

而对于符号链接:

  • 对符号链接以及它指向何种对象并无任何文件系统限制;
  • 任何用户都可以创建指向目录的符号链接。

跟随符号链接

符号链接一般用于将一个文件或整个目录结构移到系统中另外一个位置。

用符号链接作为函数参数时,需要了解该函数所处理的是否是符号链接指向的文件。也就是是否跟随符号链接

  • 如果该函数具有处理符号链接的功能,则其路径名参数引用由符号链接指向的文件。
  • 否则,一个路径名参数引用链接本身。

图4-17列出了本章中所说明的各个函数是否处理符号链接。

特殊的例子:

如果同时使用O_CREAT和O_EXCL,调用open函数。

  • 我们知道如果要打开的是文件,而文件已经存在,则出错。如果不存在则创建此文件,这使得测试和创建两者成为一个原子操作。
  • 如果要打开的是符号链接,不管符号链接指向的文件是否存在,都会返回错误。这种处理方式的意图是堵塞一个安全性漏洞,以防止具有特权的进程被诱骗写错误的文件。

    例如:进程A用于写已经存在的A.txt文件,如果删除A.txt文件,而把A.txt文件制作成一个符号链接指向自定义文件,进程就可以随意写任何文件了。

符号链接可能引入循环

使用符号链接可能在文件系统中引入循环。大多数查找路径名的函数在这种情况发生时都将出错返回,errno值为ELOOP。考虑下列命令序列:

harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples$ mkdir foo
harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples$ touch foo/a
harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples$ ln -s ../foo foo/testdir
harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples$ ls -l foo
total 0
-rw-rw-r-- 1 harlan harlan 0 Jun 11 16:40 a
lrwxrwxrwx 1 harlan harlan 6 Jun 11 16:40 testdir -> ../foo

图4-18显示了结果:

可以一直循环下去。。。

harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples$ cd foo/testdir/testdir/testdir/testdir
harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples/foo/testdir/testdir/testdir/testdir$

Solaris的标准函数ftw以降序遍历文件结构,打印遇到的每个路径名,直至ftw出错返回。但是Linux中的ftw和nftw记录了看到的目录并避免多次重复一个目录,因此这两个函数不显示solaris中ftw的出错运行行为。

open一个符号链接

open函数跟随符号链接,如果符号链接指向的文件不存在,open返回出错,表示它不能打开该文件。这可能会使不熟悉符号链接的用户感到迷茫:

harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples$ ln -s /no/sucn/file myfile
harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples$ ll myfile
lrwxrwxrwx 1 harlan harlan 13 6月 12 08:28 myfile -> /no/sucn/file
harlan@DESKTOP-KU8C3K5:/github/APUE/chapter_4/myexamples$ cat myfile
cat: myfile: 没有那个文件或目录

创建和读取符号链接

使用symlink或者symlinkat函数创建一个符号链接。

#include <unistd.h>
int symlink(const char* actualpath,const char *sympath);
int symlinkat(const char*actualpath,int fd,const char* sympath);
成功返回0;如果出错返回-1

调用这两个函数创建符号链接时:

  • 不要求actualpath已经存在。
  • actualpath和sympath并不需要位于同一个文件系统中。

因为open函数跟随符号链接,因此需要有一种方法打开链接本身,并读该链接中的名字。readlink和readlinkat函数提供了这种功能:

#include <unistd.h>
ssize_t readlink(const char* restrict pathname,char *restrict buf,size_t bufsize);
ssize_t readlinkat(int fd,const char* restrict pathname,char * restrict buf,size_t bufsize);
成功返回读取的字节数;如果失败返回-1。

APUE-文件和目录(七)符号链接的更多相关文章

  1. [APUE]文件和目录(上)

    一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...

  2. [APUE]文件和目录(中)

    一.link.unlink.remove和rename 一个文件可以有多个目录项指向其i节点.使用link函数可以创建一个指向现存文件连接 #include <unistd.h> int ...

  3. APUE 文件和目录

    文件和目录 Unix 所有的文件都对应一个 struct stat,包含了一个文件所有的信息. #include <sys/stat.h> struct stat { mode_t st_ ...

  4. [APUE]文件和目录(下)

    一.mkdir和rmdir函数 #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *pathn ...

  5. APUE ☞ 文件和目录

    粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...

  6. [置顶] 文件和目录(二)--unix环境高级编程读书笔记

    在linux中,文件的相关信息都记录在stat这个结构体中,文件长度是记录在stat的st_size成员中.对于普通文件,其长度可以为0,目录的长度一般为1024的倍数,这与linux文件系统中blo ...

  7. UNIX 环境高级编程 文件和目录

    函数stat , fstat , fstatat , lstat stat函数返回与此文件有关的信息结构. fstat函数使用已打开的文件描述符(而stat则使用文件名) fstatat函数 为一个相 ...

  8. Find 查找命令时过滤掉某些文件或目录 以及 -maxdepth、-mindepth的用法

    1)find过滤目录使用find命令在linux系统中查找文件时,有时需要忽略某些目录,可以使用"-path 过滤的目录路径 -prune -o"参数来进行过滤.不过必须注意:要忽 ...

  9. (三) 一起学 Unix 环境高级编程 (APUE) 之 文件和目录

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  10. apue chapter 4 文件和目录

    1.文件信息结构体 struct stat{ mode_t st_mode; //file type and permissions ino_t st_ino; //i-node number (se ...

随机推荐

  1. 2017/4/27-Gradle的配置与Spring的下载

    Gradle的配置与Spring的下载 1.Gradle 1) 介绍 Gradle是一个基于Groovy的构建工具,类似Maven,但是比其更加简单轻便.它可以自动化地进行软件构建.测试.发布.部署. ...

  2. 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10的100次幂。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi san wu

    这是PAT中的一道练习题 刚开始的时候我想着直接定义正整数n,结果走了很大的弯路,因为题目中要求n小于10的100次幂,即最大的正整数n有100位,而C语言中整型数字最大占8个字节的存储空间,如果按无 ...

  3. myeclipse/eclipse 配置SSM框架错误之一解决方法

    报错如下: 1. [org.springframework.web.context.ContextLoader] - Root WebApplicationContext: initializatio ...

  4. CSS完美实现iframe高度自适应(支持跨域)

    Iframe的强大功能偶就不多说了,它不但被开发人员经常运用,而且黑客们也常常使用它,总之用过的人知道它的强大之处,但是Iframe有个致命的"BUG"就是iframe的高度无法自 ...

  5. C#集合之字典

    字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素.字典也称为映射或散列表. 字典的主要特性是能根据键快速查找值.也可以自由添加和删除元素,这有点像List<T>(http: ...

  6. [笔记]机器学习(Machine Learning) - 02.逻辑回归(Logistic Regression)

    逻辑回归算法是分类算法,虽然这个算法的名字中出现了"回归",但逻辑回归算法实际上是一种分类算法,我们将它作为分类算法使用.. 分类问题:对于每个样本,判断它属于N个类中的那个类或哪 ...

  7. 解决U盘容量变小问题

    今天又想重新给电脑刷刷kali linux新版本了貌似N久没更,直接重新刷系统吧...然后发现USB容量变小,这就尴尬了,接着总结了个小方法. 解决方法:1.先把u盘插好,运行cmd,2.输入disk ...

  8. 自己实现的一个简单的EF框架(反射实现)

    我实现了一个简单的EF框架,主要用于操纵数据库.实现了对数据库的基本操纵--CRUD 这是项目结构 这是一个 core 下的 DLL 写了一个数据库工厂,用于执行sql语句.调用sql语句工厂 写了一 ...

  9. nodejs弯路-01之'express' 不是内部或外部命令

    最近正想用node+angular+mongodb来完成一个小项目,三样都算是从零开始学习吧. 一开始是想用express -e projectname去创建一个ejs模板的项目.(一两句话就可以把大 ...

  10. JSON的使用小结

    JSON中存储的是key:value,其实在编程的时候我们会遇到很多都是key:value的形式.比如:map,java对象(一个对象的一个属性只会有一个值),数据库中key:value对应着里面存储 ...