符号链接的创建和读写 -- symlink、readlink

2014-07-21 10:29:27   最后更新: 2014-07-21 10:36:08   访问数量:807




符号链接是指向一个文件的间接指针,它与硬链接的区别在于硬链接直接指向文件的i节点,并且硬链接有以下限制,而符号链接没有:

  1. 硬链接通常要求链接和文件在同一文件系统中
  2. 只有超级用户才能创建指向目录的硬链接

而任何用户都可以创建指向目录的或其他文件系统中文件的符号链接

 

需要注意的是,有些函数在处理符号链接时,会跟随符号链接处理其指向的文件,而另一些则只处理符号链接本身

  • 不跟随符号链接的函数:

lchown、lstat 、readlink、remove、rename、unlink

  • 跟随符号链接的函数:

access、chdir、chmod、creat、exec、link、open、opendir、pathconf、stat、truncate

  • chown 函数根据取决于具体实现

 

另外,同时使用O_CREAT和O_EXCL两个参数调用open函数,如果路径名引用的是符号链接,函数将返回出错,并将errno设置为EEXIST,以防止进程被符号链接引诱到不适当的文件处读写

当open一个符号链接时,实际打开的却是其指向的文件,如果符号链接所指向的文件不存在,则会返回出错

 

对于指向其父目录的符号链接,在遍历时可能会出现循环,大多数函数在遇到这种情况时会返回置为ELOOP的errno。

消除循环是很容易的,因为unlink是不跟随符号链接的,但是如果硬链接构成了循环,那么就很难消除了,这就是为什么不允许普通用户构造指向目录的硬链接的原因

 

int symlink (const char *path, const char *linkpath);

 

定义于unistd.h中,调用成功返回0,否则返回-1

该函数并不要求path是已经存在的,并且两者不需要位于同一文件系统中

 

ssize_t readlink(const char *path, char *buf, size_t bufsiz);

 

定义于unistd.h中,调用成功返回读到的字符数,否则返回-1

  • ssize_t

在unix环境中,ssize_t 是 __SWORD_TYPE 的别名,__SWORD_TYPE 在 32 位系统中是 32 位的,在 64 位系统中是 64 位的

 

将参数path的符号链接内容存储到参数buf所指的内存空间,需要注意的是返回的buf不以\0结尾,readlink()函数组合了open()、read()和close()的所有操作。

 






读书笔记      技术帖      linux      unix      龙潭书斋      apue      unix环境高级编程      link      ln      symlink      readlink     


京ICP备15018585号