您的位置:首页 > 其它

第四章:权限测试

2013-05-30 19:53 183 查看
当用 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

#include<stdio.h>
#include<unistd.h>

/************************************
*F_OK  用于确定文件是否存在
*************************************/

int             is_exist(const char* filename);
int             is_exist(const char* filename)
{
return  access(filename,F_OK);
}

int
main(int argc,char** argv)
{
int             ret;
char*   p;

/*测试文件是否存在*/
p = (ret=is_exist(argv[1]))?"不":"";
printf("文件%s%s存在\n",argv[1],p);

if(ret == 0){
/*测试文件是否可读*/
p = access(argv[1],R_OK)?"不":"";
printf("文件%s可读\n",p);
/*测试文件是否可写*/
p = access(argv[1],W_OK)?"不":"";
printf("文件%s可写\n",p);
/*测试文件是否可执行*/
p = access(argv[1],X_OK)?"不":"";
printf("文件%s可执行\n",p);
}
return  0;
}


umask函数

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

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

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

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

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>

#define         RWRR    (S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)
int
main(void)
{
int             msk = umask(0);
printf("umask = %.3o\n",msk);
umask(msk);

close(open("file_0",O_CREAT|O_WRONLY));
close(creat("file_1",RWRR));
umask(0777);
close(creat("file_2",RWRR));
return  0;
}

结果:
---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  


    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: