UNIX环境高级编程:符号链接

符号链接是指向一个文件的间接指针。他与上一节所诉的硬链接不同。硬链接直接指向文件的i节点。引入 符号链接的原因是为了避开硬链接的一些限制。

硬链接通常要求链接和文件位于同一文件系统中。

只有超级用户才能创建指向目录的硬链接。

对符号链接以及他指向何种对象并无任何文件系统限制。任何用户都可以创建指向目录的符号链接。符号 链接一般用于将一个文件或这个目录结构移动到系统中的另一个位置。

当使用以名字引用文件的函数 的时候,应当了解该函数是否处理符号链接。也就是该函数是否跟随符号链接到达它锁链节的文件。如若该函 数具有处理符号链接的功能,则其路径名参数引用由符号链接指向的文件。否则路径名参数将引用链接本身。 而不是该链接指向的文件。下表列出了本章中所说明的各个函数是否处理符号链接。

函数 不跟随符号链接 跟随符号链接
access    
chdir    
chmod    
chown    
creat    
exec    
lchown    
link    
lstat    
   
opendir    
pathconf    
readlink    
remove    
rename    
stat    
truncate    
unlink    

上表没有列出mkdir,mkinfo,mknod和rmdir这些函数。其原因是当路径名是符号链接的时候,他 们都出现错误返回。以文件描述符作为参数的一些函数也未在该表中列出。原因是,对富豪链接的处理是由返 回文件描述符的函数同事是open进行的。chown是否跟随符号链接取决于实现。

上表中一个例外是,同 时用O_CREAT和O_EXCL两者调用open函数。在此情况下,若路径名引用符号链接,open函数将出错返回。并将 errno设置成EEXIST..这种处理方式的意图是阻塞一个安全性漏洞。使其具有特权的进程不会被诱骗对不适合 的文件进行写操作。

实例:

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

[devis@gdmss unix_pro]$ mkdir foo
[devis@gdmss unix_pro]$ touch foo/a
[devis@gdmss unix_pro]$ ln -s ../foo foo/testdir
[devis@gdmss unix_pro]$ ls -l foo
总计 0
-rw-rw-r-- 1 devis devis 0 10-24 22:03 a
lrwxrwxrwx 1 devis devis 6 10-24 22:03 testdir -> ../foo

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
, 函数
, 链接
, unix高级编程
, 符号
, 处理
, 指向
, 符号链接
opendir()列出文件
,以便于您获取更多的相关知识。

时间: 2024-11-03 11:22:20

UNIX环境高级编程:符号链接的相关文章

UNIX环境高级编程中的apue.h

/************** * *apueerror.h * *************/ #include <apue.h> #include <stdio.h> #include <errno.h> /* for definition of errno */ #include <stdarg.h> /* ISO C variable aruments */ static void err_doit(int, int, const char *, va

unix高级编程-UNIX环境高级编程 times() 疑问

问题描述 UNIX环境高级编程 times() 疑问 例程 int main(int argc, char *argv[]) { clock_t s_clk,e_clk; struct tms s_tms,e_tms; s_clk = times(&s_tms); system("ls /dev"); system("date"); sleep(1); e_clk = times(&e_tms); printf("e_clk %ld - s

ubuntu-最近在学习Unix 环境高级编程,配置环境时遇到了些问题

问题描述 最近在学习Unix 环境高级编程,配置环境时遇到了些问题 最近再看APUE(UNix 环境高级编程)的第三版,照着教程在中配置环境.也就是想要运行书中的源码,则要安装 libbsd-dev包,而每次安装这个包时,都如上报错,请问各位大虾,该怎么解决呢? 解决方案 你好, 类似的问题我也遇到过 ubuntu下apt-get install安装软件, 报"无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系",今天终于找到解决方法了. 一般出现这种情况的原

unix环境高级编程-UNIX环境高级编程源代码对应

问题描述 UNIX环境高级编程源代码对应 今天开始学习UNIX环境高级编程,书中的源代码下载到了,但是发现根本不是按章节来的,找起来是相当的费时间,有哪位大神用过后知道他们的对应关系么,比如1-1对应ls1.c这样,真是万分感激,造福大家啊!

Mac OS X 10.8 中编译APUE(Unix环境高级编程)的源代码过程_C 语言

最近在温习APUE(<unix环境高级编程>),以前都是在linux下搞,现在打算在自己机器弄下,于是google了下,把编译的事情搞定了,修改了一些教程的一些错误,比如下载链接之类的. 1.下载源文件,我这里是第二版,貌似第三版的英文版出来了... 复制代码 代码如下: wget http://www.apuebook.com/src.2e.tar.gz 2.解压 复制代码 代码如下: tar zxf src.2e.tar.gz 3.修改些东西 复制代码 代码如下: cd apue.2e/

UNIX环境高级编程---标准I/O库

前言:我想大家学习C语言接触过的第一个函数应该是printf,但是我们真正理解它了吗?最近看Linux以及网络编程这块,我觉得I/O这块很难理解.以前从来没认识到Unix I/O和C标准库I/O函数压根不是一码事.Unix I/O也叫低级I/O,也叫Unbuffered I/O,是操作系统内核部分,也是系统调用:而C标准I/O函数相对也成Buffered I/O,高级I/O,一般是为了效率考虑对这些系统调用的封装.以前使用getchar()经常为输入完后的回车而出错.那是不理解标准I/O实现时的

UNIX环境高级编程:线程同步之互斥锁、读写锁和条件变量

一.使用互斥锁 1.初始化互斥量 pthread_mutex_t mutex =PTHREAD_MUTEX_INITIALIZER;//静态初始化互斥量 int pthread_mutex_init(pthread_mutex_t*mutex,pthread_mutexattr_t*attr);//动态初始化互斥量 int pthread_mutex_destory(pthread_mutex_t*mutex);//撤销互斥量 不能拷贝互斥量变量,但可以拷贝指向互斥量的指针,这样就可以使多个函数

UNIX环境高级编程:线程属性

pthread_attr_t 的缺省属性值 1.初始化一个线程对象的属性 int pthread_attr_init(pthread_attr_t *attr); 返回值:若是成功返回0,否则返回错误的编号 形  参: attr       指向一个线程属性的指针 说  明:Posix线程中的线程属性pthread_attr_t主要包括scope属性.detach属性.堆栈地址.堆栈大小.优先级. pthread_attr_init实现时为属性对象分配了动态内存空间. 线程属性结构如下: typ

UNIX环境高级编程:线程属性之并发度

并发度控制着用户级线程可以映射的内核线程或进程的数目.如果操作系统的实现在内核级的线程和用户级的线程之间保持一对一的映射,那么改变并发度并不会有什么效果,因为所有的用户级线程都可能被调度到.但是,如果操作系统的实现让用户级线程到内核级线程或进程之间的映射关系是多对一的话,那么在给定时间内增加可运行的用户级线程数,可能会改善性能. pthread_setconcurrency函数可以用于提示系统,表明希望的并发度. #include <pthread.h> int pthread_getconc