• 第四章:权限测试


    当用 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  



        

  • 相关阅读:
    LINUX下用select实现串口通讯示例
    续——老机焕发青春——win8 ramos 的本地安装 (涉及vhd差分盘)
    nexus 4 下 ubuntu touch 配置 nodejs环境
    nexus 4 下 DualBootInstallation 安装 ubuntu touch
    老机焕发青春 之硬盘篇
    Mac 10.9.2后airplay出现的bug
    初识javascript(一):js在windows下运行的几种形式
    过了一年了.关于扁平化.和一些唠叨
    inet_ntop(), inet_pton() inet_ntoa(), inet_aton(), inet_addr, htons(), htonl(), ntohs(), ntohl() struct hostent ,struct sockaddr_in
    gethostbyname尽量少用
  • 原文地址:https://www.cnblogs.com/wowk/p/3108888.html
Copyright © 2020-2023  润新知