皇冠体育平台出租haozbbs.com Q1446595067 open()和creat()创建文件时,文件权限说明
首先了解一下 umask 命令,该命令用来设置限制新文件权限的掩码。当新文件被创建时,其最初的权限由文件创建掩码决定。简单地来说,umask和open()及creat()函数的权限码(mode_t mode参数)共同决定你的新建文件的权限。具体关系为mode & ~umask。
下面通过简单的程序来验证它们之间的关系。
Linux C
由于open()和creat()创建文件,结果一致,我们直接采用creat()函数:
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int main()
{
if( creat("/aicamel/boa/file.txt",0777) < 0 ) {
printf("文件创建失败!\n");
} else {
printf("文件创建成功!\n");
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
编译和运行
[email protected]:/aicamel/boa# gcc -o test test.c
[email protected]:/aicamel/boa# ./test
文件创建成功!
[email protected]:/aicamel/boa# ls -l file.txt
-rwxr-xr-x 1 root root 0 7月 5 09:24 file.txt
[email protected]:/aicamel/boa# umask
0022
[email protected]:/aicamel/boa#
1
2
3
4
5
6
7
8
我们可以看到实际创建的 file.txt 文件权限为 -rwx r-x r-x,并且当前系统的 umask 值为 0022 。我们创建文件时,希望创建的文件权限为 0777 ,也就是-rwx rwx rwx。我们现在来验证一下是否满足mode & ~umask。
~umask即为umask 取反值为 1755
我们创建文件的 mode 值为 0777
mode & ~umask 为 0755,也就是-rwx r-x r-x,与实际创建的文件权限一致。
看到这你应该知道怎么一回事了,但是如果我们的程序运行在ARM开发板上时,有时会出现umask值同样为0022,mode值同样为0777,当创建出的文件权限始终为-rw- - - - - - -,无论我们如何修改umask值和mode值,创建出的文件权限始终不变,如果遇到这种情况,我们需要使用umask()函数,即可解决这个问题。
使用umask()函数
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
int main()
{
umask(0000); //将umask值设置为0000,实际创建的文件权限即为下面的mode值
if( creat("/aicamel/boa/file.txt",0777) < 0 ) {
printf("文件创建失败!\n");
} else {
printf("文件创建成功!\n");
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
编译运行结果为
[email protected]:/aicamel/boa# gcc -o test test.c
[email protected]:/aicamel/boa# ./test
文件创建成功!
[email protected]:/aicamel/boa# ls -l file.txt
-rwxrwxrwx 1 root root 0 7月 5 09:51 file.txt
[email protected]:/aicamel/boa# umask
0022
[email protected]:/aicamel/boa#
1
2
3
4
5
6
7
8
从运行结果来看,代码中使用umask()函数,并不会改变系统的umask值,只会临时改变umask值。所以个人建议,我们使用open()和creat()时,在代码上方加上一句umask(0000);,这样我们在使用open()和creat()时,就不需要特别计算mode值了。
原文地址:http://blog.51cto.com/13861635/2139691