[APUE]文件和目录(上)
一、文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/details/6990656,总结一下 每一个进程其实对应了6个以上的ID,它们分别是:实际用户ID、实际组ID(我们实际上是谁,执行这个程序的用户和组),有效用户ID、有效组ID、附加组ID(用于文件访问权限检查),保存设置用户ID,保存设置组ID(由exec函数保存) 实际用户ID/实际组ID:当前执行这个进程的ID,比如我现在是orlion用户,那么我执行foo程序,那么这个foo进程的实际用户ID就是orlion。组同理。一般来说就是当前登陆的用户。 有效用户ID/有效组ID:这个ID是unix一直在使用的一个ID,因为即使你只是一个很简单的访问文件,那也是要通过这个有效用户ID的,因为每一个文件都有一定的访问权限,而一个进程或者一个程序去访问它,操作系统本身就是根据你的有效用户ID给与一定的权限. 实际用户ID与有效用户ID到底什么区别?!:这两个ID在一般情况下是相同的,比如当前用户是orlion,那么它的实际用户ID是orlion,而有效用户ID也是orlion。可是在不一般的情况下那么这两个ID就可能不一样了,那么什么样的情况下是不一样的呢?那就是当一个用户要进行一个合理的特权的时候就需要啦,那么到底是怎么样的情况呢? ? ? ? 比如我们在Linux系统中的passwd这个命令或者这个passwd这个程序,一个用户对自己进行修改密码是一种很正常的事情,可是保存密码的文件/etc/passwd却是root用户可写的这样的权利,那么也就是用如果你要修改密码,必须通过root用户帮你修改 这个事情的处理是这样的,让用户去运行passwd这个程序的时候,os给与root用户的权利,然后用户就可以修改自己的密码。具体的讲就是让用户去运行passwd这个程序的时候,unix将它的有效用户ID变成了拥有passwd的用户的ID,也就是root,所以就可以修改这个/etc/passwd这个文件。 保存设置用户ID:这个ID是用来保存有效ID的副本,让我们运行程序的过程其实就是os调用exec系列函数来调用我们程序的main函数,exec函数是kernel唯一执行程序的方法,或者那么讲不管什么用户程序的运行,其实也就是os的exec的调用过程。而exec在调用过程中会将这个程序的有效用户ID拷贝给保存用户ID。 在P O S I X . 1中,这些保存的I D是可选择的。一个应用程序在编译时可测试常数_ POSIX_SAVED_ IDS,或在运行时以参数_ SC_SAVED_IDS调用函数sysconf,以判断此实现是否支持这种特征。 上边是与进程相关联的ID,下面提到的设置用户ID位则是文件方式字中的一位(与进程无关,是文件属性)。 文件的设置用户ID位:每一个文件都有一个文件模式字(st_mode),这个字可以通过stat函数去获取,而这个模式字包含了很多文件的属性,包括文件的类型,以及文件的访问权限的,当然设置用户ID位也在其中。通过设置这个位,就能当执行这个文件的时候,进程的有效ID设置为该文件本身的用户,这里这个文件可以认为是可执行文件,当运行这个文件的时候,进程会改变其有效用户ID,变成这些文件本身的ID 终端中我们查看/usr/bin/passwd这个文件 $ ll /usr/bin/passwd -rwsr-xr-x. 1 root root 30768 2月 22 2012 /usr/bin/passwd 可以看到有一个s权限,这就是设置了设置用户ID位的标志。
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <unistd.h> int main() { printf("real user ID = %dn",getuid()); printf(effect user ID = %dn0; } 从以上可以看到有效用户id发生了变化 2.?新文件和目录的所有权 新目录所有权与新文件的所有权的规则相同 新文件的用户ID设置为进程的有效用户ID。组ID POSIX.1允许选择下列之一作为新文件的组ID (1)?新文件的组ID可以是进程的有效组ID (2) 新文件的组ID可以是它所在目录的组ID 二、chmod和fchmod函数 这两个函数使我们可以更改现存文件的存取许可权(权限) #include <sys/types.h> #include <sys/stat.h> int chmod(const char *pathname,mode_t mode); int fchmod(int fileds,mode_t mode); fileds即为文件句柄 为了改变一个文件的权限,进程的有效用户ID必须等于文件的所有者,或者有root权限 参数mode是下面所示逐位或运算
mode 说明明 S_ISUID 执行时设置 -用户-ID S_ISGID 执行时设置 -组-ID S_ISVTX 保存正文 S_IRWXU 用户(所有者)读、写和执行 S_IRUSR 用户(所有者)读 S_IWUSR 用户(所有者)写 S_IXUSR 用户(所有者)执行 S_IRWXG 组读、写和执行 S_IRGRP 组读 S_IWGRP 组写 S_IXGRP 组执行 实例: #include <stdio.h>int main(void) { struct stat statbuf; if (stat(foo",&statbuf) < ) { fprintf(stderr,stat error for foon); } if (chmod(chmod error for foon/* set absolute mode to "rw-r--r--" */ barchmod error for barnreturn ; } ? 三、 粘住位 四、 chown、fchown和lchown函数 #include <sys/types.h> #include <unistd.h> int chown(int fchown( filedes,1)">int lchown(1. lchown更改符号连接本身的所有者,而不是符号链接所指向的文件 根据_POSIX_CHOWN_RESTRICTED的值,POISX.1可以选择只有超级用户才能更改某个文件的所有者或者任何用户都能修改他们所拥有的文件的所有者。 若_POSIX_CHOWN_RESTRICTED对指定的文件起作用,则 (1) 只有超级用户进程能更改该文件的用户 ID。 五、 文件长度 六、 文件截短 #include <sys/types.h>int truncate(int ftruncate(1. 这两个函数将文件的长度截短为length, 如果之前文件长度大于length,则超过length以外的数据就不再存取,如果以前的长度小于length,则其结果与系统有关。如果某个系统的处理是扩展该文件,则超过旧文件尾端与新文件尾端数据将读作0。 七、 文件系统 传统的UNIX系统V文件系统,可以将一个硬盘分为多个分区,每个分区可以包含一个文件系统
? i节点是固定长度的记录项,包含有关文件的信息。
? 对于目录文件的连接计数字段:假如我们创建了一个testdir目录: $ mkdir testdir
下图显示了其结果,显式的显示了.和..目录项
2549的i节点,其类型字段表示它是一个目录,其类型字段表示它是一个目录。而连接计数为2。任何一个叶目录(不包含任何目录(子目录)的目录)其连接计数总是2,数值2来自于命名该目录(testdir)的目录以及在该目录中的.项。编号为1267的i节点,其类型字段表示它是一个目录,而其连接计数则大于或等于3。它大于等于3的原因是至少有三个目录项指向它:一个是命名它的目录项,一个是在该目录中的.项,第三个是在自子目录testdir中的..项。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |