个人学习整理,如有不足之处,请不吝不吝赐教。转载请注明:@CSU-Max

系列博文:

Linux&Unix学习第二弹
-- 文件描写叙述符与权限

文件描写叙述符

每个UNIX进程都有一个文件描写叙述符范围,其大小为0到N,N标志文件描写叙述符的最大值。N的大小取决于UNIX的版本号及系统配置。

实际上。它是一个索引值,指向内核为每个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时。内核向进程返回一个文件描写叙述符。在Linux和Unix操作系统的程序设计中。一些涉及底层的程序编写往往会环绕着文件描写叙述符展开。

标准文件描写叙述符

一般在进程执行时前三个文件描写叙述符就已经打开了。

文件描写叙述符 0 : 标准输入

文件描写叙述符 1 : 标准输出

文件描写叙述符 2 : 标准错误输出

除了使用数字来表示之外。也能够使用符号常数,相应的各自是为:STDIN_FILENO, STDOUT_FILENO。 STDERR_FILENO。

这些标准文件描写叙述符中不论什么一个都能够打开文件、管道、FIFO、设备甚至是套接字,调用read和write系统调用时能够马上使用这三个标准文件描写叙述符。用于文件、管道等其它的文件描写叙述符能够通过进程本身获得。

文件描写叙述符仅仅是对每一个进程表的索引。

进程表中每一个记录项指向一个全系统的打开文件描写叙述(即文件表记录项)。而文件描写叙述符指向文件数据。

上述过程可用下图表示:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3N1X21heA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

如上图所看到的,多个文件描写叙述符,甚至来自不同进程的文件描写叙述符都可指向同一个文件描写叙述。

每个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 
    *

***************************************************************************

版权声明:本文博客原创文章。博客,未经同意,不得转载。

【Linux&Unix--文件描述叙事的性格和权柄】的更多相关文章

  1. Linux中的文件描述符与打开文件之间的关系

    Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...

  2. Linux exec与文件描述符

    看到好几篇文章讲述exec都是一知半解,所以我尽量说的清楚明白一些.本文首先讲述Linux文件描述符,然后是exec,最后举例说明exec I/O重定向及其用法. 概念:exec命令用于调用并执行指令 ...

  3. Linux Linux下最大文件描述符设置

    Linux下最大文件描述符设置 by:授客 QQ:1033553122 1.   系统可打开最大文件描述符设置 查看系统可打开最大文件描述符 # cat /proc/sys/fs/file-max 6 ...

  4. [svc]linux中的文件描述符(file descriptor)和文件

    linux中的文件描述符(file descriptor)和文件 linux为了实现一切皆文件的设计哲学,不仅将数据抽象成了文件,也将一切操作和资源抽象成了文件,比如说硬件设备,socket,磁盘,进 ...

  5. linux fcntl 对文件描述符控制

    linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制

  6. Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列

    http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...

  7. (转)Linux中的文件描述符

    本文转自:http://blog.csdn.net/cywosp/article/details/38965239 作者:cywosp 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为 ...

  8. linux exec和文件描述符妙用技巧(转)

    最近在看<精通unix shell脚本编程>时,看到exec<$1 exec 1>$OUTFILE,一下看的我就蒙了.网上看了大半天,终于搞定,记录如下.对于 Linux 而言 ...

  9. (转)Linux中的文件描述符与打开文件之间的关系

    转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...

随机推荐

  1. SQL SERVER IN参数化处理

    方法一. CREATE TABLE [dbo].[Users] ( Id INTEGER IDENTITY(1, 1) PRIMARY KEY , Name NVARCHAR(50) NOT NULL ...

  2. 报错compile_str() flow.php on line 375的解决方法

    flow.php line 375,flow.php  找到375行: * 保存收货人信息 */ $consignee = array( 'address_id' => empty($_POST ...

  3. 【前段开发】行内元素和块级元素总结(HTML CSS)

    块级元素 <address> information on author <blockquote> long quotation <button> push but ...

  4. Android正在使用Handler实现信息发布机制(一)

    上一篇文章,我们谈到了电话Handler的sendMessage方法,最后,我们将进入一个电话 sendMessageAtTime方法,例如下列: public boolean sendMessage ...

  5. hdu1507最大匹配

    题意:给出n*m的矩阵方块,某些方块是ponds,这些方块不能出售,然后能出售的是1*2的方块 要求求出有多少块1*2的方块能够出售,并输出这些方块的坐标(specia judge) 关键是怎么建出二 ...

  6. 玩转web之json(五)---将表单通过serialize()方法获取的值转成json

    form表单有一个serialize()方法,可以序列化表单的值,但是jquery提供的这个方法会把数据序列化为类似下面的形式: a=1&b=2&c=3&d=4 jquery并 ...

  7. Codeforces Round #191 (Div. 2) D. Block Tower

    D. Block Tower time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  8. java.net.SocketException: Unconnected sockets not implemented 解

    JDK 这一问题的版本号,至Oracle公司JDK版本号bug.于6u12-rev号修复了该问题     请将JDK版本号升级到 1.6.0_12-b05 以上.推荐1.6.0_37 http://b ...

  9. ios-html-get/post差额,简而言之(MS)CheckST

    get直接采取拉数据,post注射剂server.至server安全或使用get 而且由于get明确传递,password帐户A眼可以看得出来,甚至加密也可以很easy解,所以传password用po ...

  10. C# 5.0 Async函数的提示和技巧

    一.创建Async函数 Async是C# 5.0中新增的关键字,通过语法糖的形式简化异步编程,它有如下三种方式: async Task<T> MyReturningMethod { ret ...