符号链接

符号链接的用途

符号链接是对一个文件的间接指针,它与前面介绍的硬连接不同,硬连接指向文件的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. python基本数据类型——int

    一.int的范围 python2: 在32位机器上,整数的位数为32位,取值范围为-2**31-2**31-1: 在64位系统上,整数的位数为64位,取值范围为-2**63-2**63-1: pyth ...

  2. FrameBuffer系列 之 相关结构与结构体

    在linux中,fb设备驱动的源码主要在Fb.h (linux2.6.28\include\linux)和Fbmem.c(linux2.6.28\drivers\video)两个文件中,它们是fb设备 ...

  3. CSS的position/float/display

    一.position position属性取值:static(默认).relative.absolute.fixed.inherit. postision:static:始终处于文档流给予的位置.它可 ...

  4. poj3160强连通分量加dfs

    After retirement as contestant from WHU ACM Team, flymouse volunteered to do the odds and ends such ...

  5. 微信公众号开发笔记1(nodejs开发的)

    本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...

  6. 案例分享|某医药集团的BI建设案例

    相比于传统型BI,越来越多的企业开始接受并青睐新型的自助式BI,因其项目上线快,失败风险小,简单易用,颇受赞誉.以下是某医药集团上线帆软BI系统FineBI的案例,从用途架构.指标分析.和信息交互几方 ...

  7. [大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<2>

    前言:上篇[大数据]-Elasticsearch5.3.1+Kibana5.3.1从单机到分布式的安装与使用<1>中介绍了ES ,Kibana的单机到分布式的安装,这里主要是介绍Elast ...

  8. 下拉菜单制作——利用CSS实现的一个实例

    本文实现了一个经典的下拉菜单的制作. 首先,写出Html部分: <!DOCTYPE html> <html> <head> <meta charset=&qu ...

  9. App架构经验总结(转载)

    原文地址:http://www.iteye.com/news/31472 架构因人而异,不同的架构师大多会有不同的看法:架构也因项目而异,不同的项目需求不同,相应的架构也会不同.然而,有些东西还是通用 ...

  10. Vue声明式渲染

    Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM,也就是将模板中的文本数据写进DOM中,使用  {{data}}  的格式写入.此代码都是Vue.js官网上的实例. 1. ...