linux C access

【1】作用

  确定文件的访问权限

【2】头文件

  #include <unistd.h>

【3】函数定义

  int access(const char * pathname,  int mode);

【4】参数说明

  pathname: 需要检测的文件路径名

  mode: 参数为0时,表示检查文件的存在性,如果文件存在,返回0,不存在,返回-1。 这个函数还可以检查其它文件属性:

  06 检查读写权限

  04 检查读权限

  02 检查写权限

  01 检查执行权限

  00 检查文件的存在性

【5】返回值

  若所有欲查核的权限都通过了检查则返回0值,表示成功;只要有一权限被禁止则返回-1,表示失败。

【6】函数说明

  access()会检查是否可以读/写某一已存在的文件。

  参数mode有几种情况组合, R_OK,W_OK,X_OK 和F_OK。

  R_OK,W_OK与X_OK分别用来检查文件是否具有读取、写入和执行的权限。F_OK则是用来判断该文件是否存在。

  由于access()只作权限的核查,并不理会文件形态或文件内容,因此,如果一目录表示为“可写入”,表示可以在该目录中建立新文件等操作,而非意味此目录可以被当做文件处理。

  例如,你会发现DOS的文件都具有“可执行”权限,但用execve()执行时则会失败。

【7】错误代码

  EACCESS  参数pathname 所指定的文件不符合所要求测试的权限。

  EROFS   欲测试写入权限的文件存在于只读文件系统内。

  EFAULT  参数pathname指针超出可存取内存空间。

  EINVAL  参数mode 不正确。

  ENAMETOOLONG  参数pathname太长。

  ENOTDIR  参数pathname为一目录。

  ENOMEM  核心内存不足    

  ELOOP   参数pathname有过多符号连接问题。

  EIO I/O  存取错误。

【8】附加说明

    使用access()作用户认证方面的判断要特别小心,例如在access()后再做open()的空文件可能会造成系统安全上的问题。

【9】范例

 1 // 范例1
 2 #include <unistd.h>
 3 int main()
 4 {
 5     if (access("/etc/passwd", R_OK) == 0)
 6         printf("/etc/passwd can be read\n");
 7     return 0;
 8 }
 9 
10 // 范例2
11 #include <stdio.h>
12 #include <unistd.h>
13 
14 int file_exists(char *filename);
15 
16 int main(void)
17 {
18     printf("Does NOTEXIST.FIL exist: %s\n",
19     file_exists("NOTEXISTS.FIL") ? "YES" : "NO");
20     return 0;
21 }
22 
23 int file_exists(char *filename)
24 {
25     return (access(filename, 0) == 0);
26 }

【10】相关函数

    stat,open,chmod,chown,setuid,setgid

 

Good Good Study, Day Day Up.

顺序 选择 循环 总结

posted @ 2019-01-07 11:24  kaizenly  阅读(1846)  评论(0编辑  收藏  举报
打赏