第四章:权限测试

当用 open()  或 creat() 创建新文件时 , 新文件的 用户ID 设置为 创建文件进程的 有效用户 ID。而组ID , POSIX.1允许选择下列之一作为新文件的组ID:

    1、进程的有效组ID

    2、新文件所在目录的 组ID

access函数

  int access(const char *pathname, int mode);  所在的头文件为 <unistd.h>
       access函数以进程有效用户ID 和有效组ID为基础 , 测试 实际用户 对一个文件的访问权限\     

       access() 检查调用进程是否有权访问指定的文件。如果文件是一个符号链接的话,则跟随符号链接。

  mode参数指定了将要进行的检查 ,可以是 F_OK, 或 由 R_OK 、W_OK 、 X_OK 或这三个标志的组合.

  F_OK测试文件是否存在。  R_OK, W_OK, 和 X_OK 测试是否文件是否存在 文件是否 可写 可读 可执行 。

       当对一个文件操作的时候,检查使用的是 调用进程的实际用户 UID 和 GID 而不是 其有效ID 。 

  这个特性允许 设置用户ID 程序 很容易的决定 调用进程 的权限

  成功返回0   失败则返回 -1

 1 #include<stdio.h>
 2 #include<unistd.h>
 3 
 4 /************************************
 5 *F_OK  用于确定文件是否存在
 6 *************************************/
 7 
 8 int             is_exist(const char* filename);
 9 int             is_exist(const char* filename)
10 {
11         return  access(filename,F_OK);
12 }
13 
14 
15 int
16 main(int argc,char** argv)
17 {
18         int             ret;
19         char*   p;
20 
21         /*测试文件是否存在*/
22         p = (ret=is_exist(argv[1]))?"":"";
23         printf("文件%s%s存在\n",argv[1],p);
24 
25         if(ret == 0){
26                 /*测试文件是否可读*/
27                 p = access(argv[1],R_OK)?"":"";
28                 printf("文件%s可读\n",p);
29                 /*测试文件是否可写*/
30                 p = access(argv[1],W_OK)?"":"";
31                 printf("文件%s可写\n",p);
32                 /*测试文件是否可执行*/
33                 p = access(argv[1],X_OK)?"":"";
34                 printf("文件%s可执行\n",p);
35         }
36         return  0;
37 }

umask函数

  mode_t  umask(mode_t  cmask);  所在头文件<sys/stat.h>

  该函数用于创建进程文件模式的屏蔽字,并返回先前的屏蔽字。该函数无出错返回。

  当创建一个文件的时候,该文件模式访问位 会被赋给新文件。

  参数 cmask 中, 为1 的位 在新文件中 会被屏蔽  ,  就是说 cmask  指定的是 新创建的文件需要被屏蔽的模式位

 1 #include<stdio.h>
 2 #include<unistd.h>
 3 #include<fcntl.h>
 4 #include<sys/stat.h>
 5 
 6 #define         RWRR    (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
 7 int
 8 main(void)
 9 {
10         int             msk = umask(0);
11         printf("umask = %.3o\n",msk);
12         umask(msk);
13     
14         close(open("file_0",O_CREAT|O_WRONLY));
15         close(creat("file_1",RWRR));
16         umask(0777);
17         close(creat("file_2",RWRR));
18         return  0;
19 }

结果:
---S-w---T  1 wowk wowk    0 5月  30 19:47 file_0
-rw-r--r--  1 wowk wowk    0 5月  30 19:47 file_1
----------  1 wowk wowk    0 5月  30 19:47 file_2

可见 用 open 创建文件且不是用 mode参数 时,文件的模式标志 为随机(不明白为什么,也可能不是随机)
   当使用creat()创建的时候 , 先将 mode 与 屏蔽标志位 cmask 的取反值相与
    mode &= ~cmask  



    

原文地址:https://www.cnblogs.com/wowk/p/3108888.html