【Linux&Unix--文件描述符与权限】

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

文件描述符

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

虽然这种描述方式可读性较差,也很容易出错,但是操作者可自由安排权限位的位置,并且读编程来说它也更加方便,一般我们会一次性定义好所需要的宏,而不是在所有需要的位置都使用长的如 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--文件描述符与权限】

时间: 2024-11-08 23:35:07

【Linux&Unix--文件描述符与权限】的相关文章

Linux中文件描述符和打开文件之间的关系

Linux中文件描述符和打开文件之间的关系 文件描述符: 在形式上是一个非负整数.实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表. Linux中的文件类型 Linux系统中把一切都看做文件,包括普通文件-.目录文件d.字符设备文件c.块设备文件b.符号链接文件l.文件描述符是内核为了高效管理已被打开的文件所创建的索引(一个非负整数),用于指代已被打开的文件,Linux下所有的的I/O操作的系统调用都是通过文件描述符执行.例如0表示标准输入.1表示标准输出.3表示标准错

Linux中文件描述符fd和文件指针flip的理解

转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp. open:文件描述符的操作(如: open)返回的是一个文件描述符(int fd),内核会在每个进程空间中维护一个文件描述符表, 所有打开的文件都将通过此表中的文件描述符来引用(fd1,fd2,fd3...); fopen:而流(如: f

unix文件描述符——socket

在unix系统中,socket和普通文件一样对待,因为它可以像普通文件一样被读和写,但是它还有一些自己独特的特点,例如,文件的读写位置可以设置,但是socket只能被顺序的读写等等,那么在unix系统中,是如何实现这种方式的呢? 如下图,其中有以下重要数据结构:proc.filedesc.file等,对这些重要数据结构及其之间的关系弄清楚之后,上面的问题自然就有答案了.在本文介绍中,使用的操作系统源码为:4.4bsd-lite版本,该版本是<TCP/IP协议卷2--实现>一书使用的源码,同时该

C语言下的FILE指针与Linux的文件描述符

FILE*:它是C库中定义的一个结构体指针,我们在C语言文件操作时打开一个文件返回的指针类型就是它,在C库中是这样定义的,其中的_file它是一个整数,就是作为文件索引的描述符,C库是建立在系统调用上的,这个FILE结构体可以说是一个包装,底层还是用文件描述符对磁盘上的文件进行连接的. 文件描述符:在linux系统中每打开一个文件就会获取一个文件描述符,他是一个小整数,在linux下0号1号2号文件操作符分别是标准输入,标准输出,标准错误. 每个进程在运行时都会有个PCB,而PCB中都会有一张文

Linux下文件描述符

http://blog.csdn.net/kumu_linux/article/details/7877770 文件描述符是一个简单的整数,用以标明每一个被进程所打开的文件和socket.第一个打开的文件是0,第二个是1,依此类推.Unix操作系统通常给每个进程能打开的文件数量强加一个限制.更甚的是,unix通常有一个系统级的限制.在UNIX/Linux平台上,对于控制台(Console)的标准输入(0),标准输出(1),标准错误(2)输出也对应了三个文件描述符. 对于squid,因为squid

linux 最大文件描述符fd

使用四种框架分别实现百万websocket常连接的服务器 著名的 C10K 问题提出的时候, 正是 2001 年.这篇文章可以说是高性能服务器开发的一个标志性文档,它讨论的就是单机为1万个连接提供服务这个问题,当时因为硬件和软件的**,单机1万还是一个非常值得挑战的目标.但是时光荏苒,随着硬件和软件的飞速发展,单机1万的目标已经变成了最简单不过的事情.现在用任何一种主流语言都能提供单机1万的并发处理的能力.所以现在目标早已提高了100倍,变成C1000k,也就是一台服务器为100万连接提供服务.

【Linux】文件描述符与重定向

重定向符号 符号 描述 > 输出重定向到一个文件或设备 覆盖原来的文件 >! 输出重定向到一个文件或设备 强制覆盖原来的文件 >> 输出重定向到一个文件或设备 追加原来的文件 < 输入重定向到一个程序 标准错误重定向符号 符号 描述 2> 将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件 2>> 将一个标准错误输出重定向到一个文件或设备 追加到原来的文件 2>&1 将一个标准错误输出重定向到标准输出 注释:1 标准输出 >&

[转帖]linux文件描述符文件/etc/security/limits.conf

linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习了解一下. 文件描述符是什么?和文件句柄有啥区别? 文件描述符是linux/unix操作系统中特有的概念.相当于windows系统中的文件句柄.一个意思不同叫法. Linux系统中, 每当进程打开一个文件时,系统就为其分配一个唯一的整型文件描述符,用来标识这个文件.标准C中每个进程默认打开的有三个文

Linux 文件描述符

////////////////////////////////////////////////////////////////////////////////////////////////////// 1.UNIX文件描述符 Unix操作系统或者Linux操作系统的文件描述符使用一个非负整数来表示,但是文件描述符不仅仅是一个非负数,Unix对于文件IO有以下几个数据结构: A.       每个进程都有一个进程表,其中有个记录表项,这个记录表项指向的是一个打开文件描述符表,这个文件描述符表是