文件类型、文件用户ID组ID、文件访问许可

来源:互联网 发布:金税三期软件操作手册 编辑:程序博客网 时间:2024/05/11 06:00

1.文件类型

1.文件类型分类

a.普通文件:最常见的文件类型,该类文件中包含一个类型的数据。对于UNIX内核来说数据是文本还是二进制文件并没有区别。
   所有的普通文件内容的解释都留给应用程序去操作这个文件。
一个最大的例外是二进制可执行文件。为了执行一个程序,内核必须知道它的类型。所有的二进制可执行文件遵从一个形式允许
  内核识别去哪里装在程序的文本和数据。
b.目录:包含其它文件名和指向这些文件信息的指针的文件。任何有读目录权限的进程能够入去目录的内容,但是只有内核能够直
  接写目录文件。进程必须使用函数来更改目录内容。
      c.块特殊文件:提供缓冲I/O类型的文件访问设备固定大小的单元,比如磁盘驱动。
      d.字符设备特殊文件:能够访问变化的大小的设备的并且提供非缓冲的I/O的类型文件。
注:所有的设备不是块设备就是字符设备
      e.FIFO:进程间通信使用的文件类型。有时候又叫pipe。
      f.socket:进程间网络通信使用的文件类型。进程间的非网络通信如果仅有一个主机也可以使用socket。
g.符号链接:指向另一个文件的文件类型。

2.文件类型操作

stat结构体中的st_mode成员指明了文件类型。我们能够根据宏操作来判断文件类型。
宏操作的参数是stat结构体里面的st_mode成员。
POSIX.1允许应用将IPC看作文件,比如消息队列,信号量。而且同样是宏操作但是参数是指向stat结构体的指针。



    另外在UNIX系统中,普通文件类型占了大多数。下面的图片显示了各种文件类型所占比例。


2.设置用户ID和用户组ID

每个程序有六个或者更多的ID和它相关。
a.real user ID和real group ID证明我们是谁。这两项是从我们登陆时的密码文件里面获取的。通常,这些值不会改变在登陆
过程中,虽然超级用户的进程有方式改变它们。
b.effective user ID,effective group ID,和supplementary group ID决定我们的访问权限。
c.save set-user-ID和saved set-group-ID是在程序执行时由effective user ID和effective group ID拷贝的。
     通常,effective user ID等于real user ID,并且effective group ID等于real group ID。
    每个文件都有自己的所有者(an owner)和组所有者(a group owner)。所有者定义在stat结构体里面的st_uid成员中,
组所有者定义在st_gid成员中。
     当我们执行一个程序文件时,程序effective user ID通常是real user ID,effective group ID是real group ID。但是我们也能够设置
一个特殊标志在文件模式(st_mode)中。当改标志被设置了之后,当文件被执行时,effective user ID时文件所有者(st_uid)。同样的
我们也可以设置另一个位是的effective group ID等于文件组所有者(st_gid)。这两位叫做set-user-ID 位和set-group-ID位。这两位能
够被单独检测通过常量S_ISUID和S_ISGID,从而判断标志是否被置位。

3.文件访问权限

stat结构体中的st_mode参数也包含了文件的访问权限。
每个文件都有九种访问权限,分为三类。如图

     前三行user项是指文件所有者。chmod命令通常改变的就是这九个权限位,允许我们定义u为用户(user),g为组(group),o为 其它(other)。
文件访问权限测试内核执行打开,创建或者删除文件时依赖于文件所有者(st_uid,st_gid),有效用户ID(effective user ID, 
effective group ID),和其它组ID。两个所有者ID时文件属性,两个有效ID是进程述属性。
1.如果有效用户ID是0(超级用户),访问被允许。整个文件系统都可以被访问。
2.如果有效用户ID等于文件所有者ID,如果有效位被设置了,访问是被允许的。不然是不允许的。比如程序打开文件读取数据,
那么user-read bit必须设置。
3.如果有效组ID或者额外组ID等于文件组ID,如果有效位被设置了,访问是被允许的。
4.如果其它访问权限被设置了,访问是被允许的。
    上面四个步骤按顺序尝试。

4.新文件和目录的所有者

新文件的userID被设置为进程的有效用户ID。POSIX.1允许应用选择group ID通过两种方式:
1.文件group ID被设置为进程的有效用户组ID
2.文件group ID和文件被创建时所在目录的组ID相同

5.access和faccessat函数

1.函数原型

#include<unistd.h>
int access(const char* pathname, int mode);
int faccessat(int fd, const char* pathname, int mode, int flag);
返回值:成功返回0,失败返回-1。

2.参数介绍

mode能够是F_OK来检测文件是否存在,或者与 下面图片中的位与运算来判断。
    faccessat函数当pathname是绝对路径或者fd参数设置了AT_FDCWD的时候并且路径是相对路径的时候,能够喝access一样操作。
不然,faccessat计算pathname相对于fd指向的打开目录计算。
flag参数能够控制faccessat函数的动作。如果AT_EACCESS标志被设置了,权限检查用的是进程有效用户和有效组ID来进行判断
而不是之前的真实用户和组ID。

     


































0 0
原创粉丝点击