Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5634558
  • 博文数量: 922
  • 博客积分: 19333
  • 博客等级: 上将
  • 技术积分: 11226
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 14:33
文章分类

全部博文(922)

文章存档

2023年(1)

2020年(2)

2019年(1)

2017年(1)

2016年(3)

2015年(10)

2014年(17)

2013年(49)

2012年(291)

2011年(266)

2010年(95)

2009年(54)

2008年(132)

分类: LINUX

2011-12-30 19:35:16

++++++APUE读书笔记-04文件和目录(6)++++++
 
16、符号链接
================================================
 硬链接的局限是:
 a硬链接和文件必须在同一个文件系统之下。
 b只有超级用户才能够创建目录的硬链接。
 一个目录的软链接(也就是符号链接)就没有这些限制,它可以由任何人创建,可以创建目录或者文件的软链接,以及在不同文件系统上创建某个文件或者目录的软链接。软链接是不能用rmdir来删除的,因为软链接是一个文件,不是目录。用rm -r 也是只删除了这个软链接本身。
 当使用以名字引用一个处理文件的函数时,应当知道该函数是否能够处理符号连接。也就是这个函数是否跟随符号连接到达它所连接的文件,然后对被连接的文件进行正确地操作,而不是指向文件的链接本身。如若该函数可以处理符号连接,则传递给该函数的符号链接的路径名参数,会最终引用到由符号连接指向的文件;否则,只是引用到路径参数引用的链接本身,而不是由该链接指向的文件。这里列出了如果传递的路径是一个符号链接的时候,哪些函数会沿着符号链接跟踪到相应的文件(即对符号链接进行处理),或者不跟踪(即不处理符号链接)。
   各种函数对符号链接的处理
+-------------------------------------------------------------------+
| Function | Does not follow symbolic link  | Follows symbolic link |
|----------+--------------------------------+-----------------------|
| access   |                                |           •           |
|----------+--------------------------------+-----------------------|
| chdir    |                                |           •           |
|----------+--------------------------------+-----------------------|
| chmod    |                                |           •           |
|----------+--------------------------------+-----------------------|
| chown    |               •                |           •           |
|----------+--------------------------------+-----------------------|
| creat    |                                |           •           |
|----------+--------------------------------+-----------------------|
| exec     |                                |           •           |
|----------+--------------------------------+-----------------------|
| lchown   |               •                |                       |
|----------+--------------------------------+-----------------------|
| link     |                                |           •           |
|----------+--------------------------------+-----------------------|
| lstat    |               •                |                       |
|----------+--------------------------------+-----------------------|
| open     |                                |           •           |
|----------+--------------------------------+-----------------------|
| opendir  |                                |           •           |
|----------+--------------------------------+-----------------------|
| pathconf |                                |           •           |
|----------+--------------------------------+-----------------------|
| readlink |               •                |                       |
|----------+--------------------------------+-----------------------|
| remove   |               •                |                       |
|----------+--------------------------------+-----------------------|
| rename   |               •                |                       |
|----------+--------------------------------+-----------------------|
| stat     |                                |           •           |
|----------+--------------------------------+-----------------------|
| truncate |                                |           •           |
|----------+--------------------------------+-----------------------|
| unlink   |               •                |                       |
+-------------------------------------------------------------------+
 例如open会follow一个symbolic link.如果一个symbolic指向一个不存在的文件,那么open的时候会提示没有这样的文件,如果大家不清楚symbolic link的工作原理,可能会被这种现象所困惑,举例如下:
 $ ln -s /no/such/file myfile            create a symbolic link
 $ ls myfile
 myfile                                  ls says it's there
 $ cat myfile                            so we try to look at it
 cat: myfile: No such file or directory
 $ ls -l myfile                          try -l option
 lrwxrwxrwx 1 sar        13 Jan 22 00:26 myfile -> /no/such/file
 我们好像看到了一个myfile的文件,但是ls的时候却提示没有这个文件。实际上,myfile是一个符号链接,这个符号链接所指向的文件"/no/such/file"根本就不存在。
参考:

17、symlink和readlink函数
================================================
 symlink函数创建一个符号连接。声明如下:
 #include
 int symlink(const char *actualpath, const char *sympath);
 返回:如果成功返回0,如果错误返回1(实际值一般为-1)。
 该函数创建了一个指向actualpath的新目录项sympath,在创建此符号连接时,并不要求actualpath已经存在。并且,actualpath和sympath不必位于同一文件系统中。
 因为open函数跟随符号连接,所以需要有一种方法打开该连接本身,并读取该连接中的名字。readlink函数提供了这种功能。声明如下:
 #include
 ssize_t readlink(const char* restrict pathname, char *restrict buf, size_t bufsize);
 返回:如果成功返回读取的字节数目;错误返回1(实际值一般为-1)。
 此函数组合了open, read和close的所有操作。如果成功,则返回读入buf的字节数。在buf中返回的符号连接的内容不以null字符终止。
 
参考:

18、文件的三种时间
================================================
 文件有三种和时间相关的属性:
 atime:访问时间。记录最后一次,例如执行exec,或者read,或者创建文件(非截断创建)的时候的时间。
 mtime:内容改变时间。记录最后一次文件内容改变的时间。
 ctime:状态改变时间。记录最后一次文件索引信息改变的时间,例如:文件名称,大小,链接数目,等一般在stat中的信息的改变。
 这里,内容改变时间(st_mtime )和状态改变时间(st_ctime)是不同的:内容改变时间是文件内容最后一次被修改的时间;状态改变时间是该文件的 i节点最后一次被修改的时间。
 因为有很多操作,它们只影响到i节点,但并没有更改文件的实际内容:文件的存取许可权、用户ID、连接数等等。而i节点中的所有信息都是与文件的实际内容分开存放的,所以,除了文件数据改变时间以外,还需要状态改变时间。
 另外,注意,系统并不保存对一个 i节点的最后一次存取时间,所以access和stat函数并不更改这三个时间中的任一个。下表给出之前讲过的各种函数对这三个时间的作用。
   各种函数对access,modification,以及changed-status时间的影响
+--------------------------------------------------------------------------------------------------------------------------------------+
|                    |     Referenced file or    |                                                 |        |                          |
|      Function      |          directory        | Parent directory of referenced file or directory| Section|           Note           |
|                    |---------------------------+-------------------------------------------------|        |                          |
|                    |    a    |    m    |    c  |       a        |       m        |       c       |        |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| chmod, fchmod      |         |         |    •  |                |                |               |   4.9  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| chown, fchown      |         |         |    •  |                |                |               |  4.11  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| creat              |    •    |    •    |    •  |                |       •        |       •       |   3.4  | O_CREAT new file         |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| creat              |         |    •    |    •  |                |                |               |   3.4  | O_TRUNC existing file    |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| exec               |    •    |         |       |                |                |               |  8.10  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| lchown             |         |         |    •  |                |                |               |  4.11  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| link               |         |         |    •  |                |       •        |       •       |  4.15  | parent of second argument|
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| mkdir              |    •    |    •    |    •  |                |       •        |       •       |  4.20  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| mkfifo             |    •    |    •    |    •  |                |       •        |       •       |  15.5  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| open               |    •    |    •    |    •  |                |       •        |       •       |   3.3  | O_CREAT new file         |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| open               |         |    •    |    •  |                |                |               |   3.3  | O_TRUNC existing file    |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| pipe               |    •    |    •    |    •  |                |                |               |  15.2  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| read               |    •    |         |       |                |                |               |   3.7  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| remove             |         |         |    •  |                |       •        |       •       |  4.15  | remove file = unlink     |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| remove             |         |         |       |                |       •        |       •       |  4.15  | remove directory = rmdir |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| rename             |         |         |    •  |                |       •        |       •       |  4.15  | for both arguments       |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| rmdir              |         |         |       |                |       •        |       •       |  4.20  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| truncate, ftruncate|         |    •    |    •  |                |                |               |  4.13  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| unlink             |         |         |    •  |                |       •        |       •       |  4.15  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| utime              |    •    |    •    |    •  |                |                |               |  4.19  |                          |
|--------------------+---------+---------+-------+----------------+----------------+---------------+--------+--------------------------|
| write              |         |    •    |    •  |                |                |               |   3.8  |                          |
+--------------------------------------------------------------------------------------------------------------------------------------+

参考:
 
 
阅读(1419) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~