更改文件权限 -- chmod、fchmod

2014-07-18 18:26:34   最后更新: 2014-07-21 07:44:09   访问数量:1093




mode_t umask ( mode_t cmask );

 

返回以前的文件模式创建屏蔽字

在进程创建一个新文件或目录时,就一定会使用文件创建屏蔽字,umask的作用是从权限中“拿走”相应的位,且文件创建时不能赋予执行权限

 

e.g.

#include "../apue.2e/include/apue.h" #include <fcntl.h> #define RWRWRW (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH) int main () { umask (0); if (creat("foo", RWRWRW)<0) err_sys("creat error for foo"); umask (S_IRUSR | S_IRGRP | S_IROTH); if (creat("bar", RWRWRW)<0) err_sys("creat error for bar"); return 0; }

 

上述代码执行后,可以看到显示结果为:

 

可见,虽然在创建bar文件时选择了creat("bar", RWRWRW),但是由于之前umask函数屏蔽了S_IRUSR | S_IRGRP | S_IROTH三位,所以bar文件只有三个写权限

 

在一个文件或目录被创建时,就一定会用到文件模式创建屏蔽字,只要是屏蔽字中置1的位,该权限就一定会关闭

 

可以用三个8进制的数字分别代表整个屏蔽字的三位,图中权限的首位为文件类型标识,若文件为目录,则为d

 

对于文件模式创建屏蔽字,每次登陆时,shell都会设置一次,但之后系统不会再做改变,但是尽管如此,我们的进程中如果要创建文件,还是要首先调用umask来确定相应的位已经被激活,否则可能因为相应的位没有被激活而无法获得权限

 

命令umask

命令uamsk可以以数字形式显示当前的屏蔽字(被拒绝的权限),-S参数可以打印当前被许可的权限的文字符号格式,以数字为参数可以修改文件模式创建屏蔽字,如umask 027

 

int chmod ( const char *filename, mode_t mode ); int fchmod (int fildes,mode_t mode);

 

更改线有文件的访问权限,调用成功则返回0,否则返回-1

 

如果想改变一个文件的权限位,进程的有效用户ID必须等于文件的所有者ID,或者该进程必须拥有管理员权限

函数中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       组执行

S_IRWXO       其他读写执行

S_IROTH       其他读

S_IWOTH       其他写

S_IXOTH       其他执行

 

e.g.

#include "../apue.2e/include/apue.h" int main () { struct stat statbuf; if (stat("../umask/foo", &statbuf) < 0) err_sys ("stat error for foo"); if (chmod("../umask/foo", (statbuf.st_mode * ~S_IXGRP) | S_ISGID)<0) err_sys ("chmod error for foo"); if (chmod("../umask/bar", S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)<0) err_sys ("chmod error for bar"); return 0; }

 

 

我们用上面的代码再次操作umask程序中所创建的两个文件,bar和foo

运行结果如图所示:

 

可见,对于foo文件,我们使用按位与或非操作修改了其中的两位,因此我们需要先调用stat函数获取他的权限,而对于bar文件,无论之前他的权限如何,我们都置一个定值给他

 

ls命令将执行权限表示为S

 

S_ISVTX位在UNIX尚未使用分页技术的早期版本中被称为“粘住位”,如果一个可执行程序被设置了这一位,那么在该程序第一次被执行并结束时,其程序正文部分的一个副本仍被保存在交换区,这使得下次执行时能够较快的将其装入内存。后来该位被称为“保存正文位”,但现在较新的UNIX中大多配置有虚拟存储系统以及快速文件系统,已经不需要使用这种技术了

现今的系统中赋予了粘住位新的功能,如果一个目录设置了粘住位,那么只有下列情况之一才能删除或更名目录下的文件:

  1. 拥有此文件
  2. 拥有此目录
  3. 是超级用户

 

int chown ( const char *pathname, uid_t owner, gid_t group) int fchown (int filedes, uid_t owner, gid_t group) int lchown ( const char *pathname, uid_t owner, gid_t group)

 

调用成功返回0,否则返回-1

对于符号链接,lchown更改的是符号链接本身的所有者ID,而不是符号链接所指向的文件的所有者ID,其他情况这三个函数功能类似

如若两个参数uid_t owner和gid_t group中有一个是-1,则不会改变其所有者ID

 






读书笔记      技术帖      linux      unix      龙潭书斋      apue      unix环境高级编程      chmod      fchmod     


京ICP备15018585号