调用open函数时,是以有效用户而不是实际用户的身份去验证进程对要打开的文件的读写权限。但是有时候我们想知道的是实际用户而非有效用户对某一文件的权限,此时就要用到access函数。
 
函数原型:int access(const char* pathname, int mode);  
      int faccessat(int fd, const char* pathname, int mode, int flag); 
所需库:#include<unistd.h>
返回值:如果文件具有指定的访问权限,则函数返回0;如果文件不存在或者不能访问指定的权限,则返回-1。
 
先说简单的access函数,pathname是文件的路径名+文件名,指定要测试的文件;mode则指明测试哪种权限,实际上有4种:

  • F_OK 值为0,判断文件是否存在
  • R_OK 值为4,判断对文件是否有读权限
  • W_OK 值为2,判断对文件是否有写权限
  • X_OK 值为1,判断对文件是否有读写权限

对于后三种情况,可以用“或”的方法将多种情况合在一起测试,比如R_OK | W_OK就代表测试进程对文件的读写权限。

 

对于faccessat函数,其用fd来指定目录,mode的含义不变,而flag可以指定是判断有效用户的权限还是实际用户的权限。

如果flag的值是AF_EACCESS(值为0x200)的话,判断的是有效用户的权限;

如果flag的值是0的话,则跟access一样,判断的是实际用户的权限。

当判断有权限时,返回0,否则返回-1.

#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h> void err_sys(char *);
void err_sys(char *err_txt)
{
printf("%s\n",err_txt);
exit();
} int main(int argc, char* argv[])
{
// access 以实际用户ID测试进程的访问权限
printf("euid = %d,egid = %d,uid = %d, gid = %d\n",geteuid(), getegid(), getuid(), getgid());
if (argc != )
err_sys("you should input: %s file_name\n",argv[]); //判断实际用户的权限
if(access(argv[], R_OK | W_OK) < )
printf("access error for RW!\n");
else
printf("access OK for RW!\n"); //以有效用户身份打开文件
if(open(argv[], O_RDWR) < )
printf("open error for RW");
else
printf("open ok for RW"); return ;
}

access函数使用的更多相关文章

  1. 文件和目录:access函数

    access函数是按照实际用户ID和实际组ID进行访问权限测试的: #include <unistd.h> int access( const char *pathname, int mo ...

  2. 文件和目录之access函数

    本篇博文内容摘自<UNIX环境高级编程>(第二版),仅作个人学习记录所用.关于本书可参考:http://www.apuebook.com/. 当用open函数打开一个文件时,内核以进程的有 ...

  3. linux C之access函数 (20

    http://blog.sina.com.cn/s/blog_6a1837e90100uh5d.html linux C之access函数 (20access():判断是否具有存取文件的权限 相关函数 ...

  4. linux下access函数

    Linux内核总是根据进程的有效用户ID和有效组ID来决定一个进程是否有权访问某个文件. 因此,在编写调整用户ID的程序时,在读写一个文件之前必须明确检查其用户是否原本就有对此文件的访问权限. 为了实 ...

  5. 程序4-2 access函数实例

    //http://blog.chinaunix.net/uid-24549279-id-71355.html /* ========================================== ...

  6. 【转】C语言中access函数

    头文件:unistd.h 功 能: 确定文件或文件夹的访问权限.即,检查某个文件的存取方式,比如说是只读方式.只写方式等.如果指定的存取方式有效,则函数返回0,否则函数返回-1. 用 法: int a ...

  7. c++ 在Ubuntu系统中使用access函数

    include<iostream> #include<stdlib.h> #include<stdio.h> #include<unistd.h> us ...

  8. access函数

    access函数是按照实际用户ID和实际组ID进行访问测试的.函数的定义如下: #include <unistd.h> int access(const char* pathname, i ...

  9. 【转载】 C中的access函数

    分类: C/C++ int   access(const   char   *filename,   int   amode); amode参数为0时表示检查文件的存在性,如果文件存在,返回0,不存在 ...

随机推荐

  1. Mysql踩过的坑

    数据表示例 1.NOT IN 结果集为空 ①SELECT class_no FROM t_student; 结果为: ②SELECT * FROM t_student where class_no n ...

  2. linux下启动关闭oracle

    1. linux下启动oracle su - oracle sqlplus /nolog conn /as sysdba startup exit lsnrctl start 2. linux下关闭o ...

  3. PyCharm下载与安装

    进入PyCharm官网 1.点击下载Community 2.选择下载路径,点击“下载” 3.双击安装包,进行安装 4. 5.选择安装路径 6.根据实际情况选择32或64位 7. 8. 9.安装完成

  4. 安装mongodb时报错 configure: error: Cannot find OpenSSL's libraries

    请安装这些包以便继续: apt-get install build-essential libexpat1-dev libgeoip-dev libpng-dev libpcre3-dev libss ...

  5. Elasticsearch-PHP 索引操作2

    索引操作 索引在客户端非常容易.因为关联数组很容易转换为JSON文档,索引文档只是提供正确和结构性的关联数组和调用方法. 单文档索引 当你索引你个文档时,可以自己提供一个ID,也可以让elastics ...

  6. 前端开发之JavaScript基础篇二

    主要内容: 1.流程控制条件语句和switch语句 2.for循环和while循环 3.Break语句和Continue语句 4.数组和数组常用方法 5.函数 6.对象 一.流程控制条件语句和swit ...

  7. 简单HttpClientUtils工具类

    package com.zy.utils; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import o ...

  8. 用Box2d物理引擎设计类似愤怒小鸟投篮游戏 物理引擎的引入和基本框架搭建

  9. nodemon 的坑

    1. 我的系统是ubuntu18.04.2 的 在使用过程中不知道什么为题 nodemon 运行的项目不在前台打印了项目, 我监听的端口 9302 一直在运行, 前台看不到 我想停止掉用 ps -ef ...

  10. 274. H-Index论文引用量

    [抄题]: Given an array of citations (each citation is a non-negative integer) of a researcher, write a ...