【Linux&Unix--文件描述叙事的性格和权柄】

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

系列博文:

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

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" >

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

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

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

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

时间: 2024-12-23 11:10:47

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

【翻译自mos文章】在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log)

在unix/linux中使用文件描述符(File Descriptors)来找回被删掉的文件(数据文件or redo log) 参考原文: Retrieve deleted files on Unix / Linux using File Descriptors (Doc ID 444749.1) 适用于: Oracle Database - Enterprise Edition - Version 8.1.7.0 to 11.2.0.3 [Release 8.1.7 to 11.2] Linu

【Linux驱动】文件描述符以及相关知识

1.文件描述符 Linux操作系统中,几乎所有的设备都被抽象成为设备文件.因此,当我们想对设备进行操作的时候可以直接去操作其相应的设备文件.设备文件即是文件,要想对文件进行操作,无非就是:打开文件.关闭文件.写入数据.读出数据等,它们分别对应的函数有open(),close(),write(),read(),就以其中的open()函数做一个分析.open函数的作用是打开一个文件. (1)它的定义:int open( const char * pathname, int flags); int o

Linux下基于文件描述符的文件操作(非缓冲)

1 文件描述符 内核为每个进程维护一个已打开文件的记录表(实现为结构体数组),文件描述符是一个较小的正整数(0-1023)(结构体数组下标),它代表记录表的一项,通过文件描述符和一组基于文件描述符的文件操作函数,就可以实现对文件的读.写.创建.删除等操作. 常用基于文件描述符的函数有open(打开).creat(创建).close(关闭).read(读取).write(写入).ftruncate(改变文件大小).lseek(定位).fsync(同步).fstat(获取文件状态).fchmod(权

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

1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果此时去打开一个新的文件,它的文件描述符会是3.POSIX标准要求每次打开文件时(含socket)必须使用当前进程中最小可用的文件描述符号

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

转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果此时去打开一个

unix文件描述符——socket

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

(转)Linux中的文件描述符

本文转自:http://blog.csdn.net/cywosp/article/details/38965239 作者:cywosp 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件.文件描述符(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符.程序刚刚启动的时候,0是标准输入,1是标准输出,2是标准错误.如果

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

最近在看<精通unix shell脚本编程>时,看到exec<$1 exec 1>$OUTFILE,一下看的我就蒙了.网上看了大半天,终于搞定,记录如下.对于 Linux 而言,所有对设备和文件的操作都使用文件描述符来进行的.文件描述符是一个非负的整数,它是一个索引值,并指向内核中每个进程打开文件的记录表.当打开一个现存文件或创建一个新文件时,内核就向进程返回一个文件描述符;当需要读写文件时,也需要把文件描述符作为参数传递给相应的函数.通常,一个进程启动时,都会打开 3 个文件:标

linux c 通过文件描述符获取文件名

在linux中每个被打开的文件都会在/proc/self/fd/目录中有记录,其中(/proc/self/fd/文件描述符号:这个文件是符号文件)的文件就是文件描述符所对应的文件. 而readlink可以取得符号连接所指的文件 函数原型: ssize_t readlink(const char *path, char *buf, size_t bufsiz); 函数说明: readlink()会将参数path的符号连接内容存到参数buf所指的内存空间,返回的内容不是以NULL作字符串结尾,但会将