C语言open()和creat()函数创建文件时 文件权限相关设置
open()和creat()创建文件时,文件权限说明
首先了解一下 umask 命令,该命令用来设置限制新文件权限的掩码。当新文件被创建时,其最初的权限由文件创建掩码决定。简单地来说,umask和open()及creat()函数的权限码(mode_t mode参数)共同决定你的新建文件的权限。具体关系为mode & ~umask。
下面通过简单的程序来验证它们之间的关系。
Linux C
由于open()和creat()创建文件,结果一致,我们直接采用creat()函数:
编译和运行
我们可以看到实际创建的 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()函数
编译运行结果为
从运行结果来看,代码中使用umask()函数,并不会改变系统的umask值,只会临时改变umask值。所以个人建议,我们使用open()和creat()时,在代码上方加上一句umask(0000);,这样我们在使用open()和creat()时,就不需要特别计算mode值了。