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