【Linux&Unix--文件描述叙事的性格和权柄】
个人学习整理,如有不足之处,请不吝不吝赐教。转载请注明:@CSU-Max
系列博文:
Linux&Unix学习第二弹 -- 文件描写叙述符与权限
文件描写叙述符
每个UNIX进程都有一个文件描写叙述符范围,其大小为0到N,N标志文件描写叙述符的最大值。N的大小取决于UNIX的版本号及系统配置。
实际上。它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时。内核向进程返回一个文件描写叙述符。在Linux和Unix操作系统的程序设计中。一些涉及底层的程序编写往往会环绕着文件描写叙述符展开。
标准文件描写叙述符
一般在进程执行时前三个文件描写叙述符就已经打开了。
文件描写叙述符 0 : 标准输入
文件描写叙述符 1 : 标准输出
文件描写叙述符 2 : 标准错误输出
除了使用数字来表示之外。也能够使用符号常数,相应的各自是为:STDIN_FILENO, STDOUT_FILENO。 STDERR_FILENO。
这些标准文件描写叙述符中不论什么一个都能够打开文件、管道、FIFO、设备甚至是套接字,调用read和write系统调用时能够马上使用这三个标准文件描写叙述符。用于文件、管道等其它的文件描写叙述符能够通过进程本身获得。
文件描写叙述符仅仅是对每一个进程表的索引。
进程表中每一个记录项指向一个全系统的打开文件描写叙述(即文件表记录项)。而文件描写叙述符指向文件数据。
上述过程可用下图表示:
如上图所看到的,多个文件描写叙述符,甚至来自不同进程的文件描写叙述符都可指向同一个文件描写叙述。
每个open或pipe系统调用都会创建一个新的打开文件描写叙述和新的文件描写叙述符。如上图所看到的,进程A两次都打开了同一个文件,得到了文件描写叙述符5和6之后。并创建了打开文件描写叙述1和2。后通过文件描写叙述符复制机制,进程A得到了文件描写叙述符5的复制品——文件描写叙述符7。当然,文件描写叙述符7指向的打开文件描写叙述与文件描写叙述符5指向的是同样的。即指向同一个打开文件描写叙述,而不是像前面所说会创建新的。进程B是进程A的子进程。文件描写叙述符3允许是文件描写叙述符5的复制品。
文件权限及表示
每一个文件的信息节点中都有一个全部者用户ID(简称全部者)和一个全部者组ID(简称组),同一时候,信息节点中还包括有三组权限位,每组三位,每组包括一个读权限位,一个写权限位和一个运行权限位。
值为1时表示同意权限。为0时表示拒绝权限。
三组权限中。一组用于全部者,一组用于组,一组用于其它用户(即不在前面两类中)。
权限位一般依照全部者、组、其它用户三组的一次顺序来表示的,通经常使用八进制数来表示。
详细表示方法例如以下图所看到的:
比如,八进制数755表示全部者有读、写和运行的权限,而组和其它用户仅仅有读和运行权限。ls 命令显示其权限组合为 rwxr-xr-x ,用二进制表示为 111101101 。
文件权限位符号
假设你觉得文件权限必须用上述的方法:9个文件权限位应该放在一起,并有一定的顺序(全部者、组、其它用户)。那就错了。
实际上并不是如此,仅仅要有这9个权限位就可以。
权限位符号就是第二种表示文件权限的方法,可用来取代传统的八进制数表示。
这些符号的形式为 S_Ipwww ,当中 p 代表訪问权限(R。W或X),www 代表谁操作(USR, GRP 或 OTH)。这就表示出了所有的9个符号。
比如之前提到的样例,不用八进制的755,可用权限位符号表演示样例如以下:
S_IRUSR | S_IWUSR | S_IXSUR | S_IRGRP |S_IXGRP | S_IROTH | S_IXOTH
当USR、GRP或OTH拥有全部的三种訪问权限时,则能够使用单独的符号,形式如: S_IRWXw 。
这里 w 表示的是用户类型,就可以为U、G或O。
故上述文件訪问权限也能够表演示样例如以下:
S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH |S_IXOTH
尽管这样的描写叙述方式可读性较差。也非常easy出错。可是操作者可自由安排权限位的位置,而且读编程来说它也更加方便,一般我们会一次性定义好所须要的宏,而不是在全部须要的位置都使用长的如 S_IRUSR 的符号序列。
#define PERM_DIRECTORY S_IRWXU
#define PERM_FILE (S_IRSUR | S_IWSUR | S_IRGRP | S_IROTH)
这样仅需改变一次宏。就能够改变整个应用程序的訪问权限策略。
***************************************************************************
* 转载请注明出处: @CSU-Max http://blog.csdn.net/csu_max *
***************************************************************************
版权声明:本文博客原创文章。博客,未经同意,不得转载。