今天发现创建文件的权限和自己规定的权限不一致,了解到了权限掩码的问题,这里总结一下。

首先权限掩码umask是chmod配套的,总共为4位(gid/uid,属主,组权,其它用户的权限),不过通常我们都只用到后面3个,第一个是特殊的权限位,暂时没有很了解。比如chmod 0777 file 就代表给file设置属主、组内用户、其他用户分别是rwx、rwx、rwx的权限。

在我的ubuntu15.04下,umask默认是0002,可以用umask指令查看,加上参数-S会更加易懂:

掩码,顾名思义,是用来掩盖了一些bit,这些bit在这里就表示权限,比如从上面的图我们可以看到0002就是掩盖了其他用户的w权限(o=rx),因为2在二进制是010,我们创建文件时候规定的文件权限***是要和掩码的反码按位相与的,这样才可以屏蔽掉某个位。比如创建文件的时候指定了0666,那么0666 & ~0002 = 0664,最终建立的文件权限为 rw-rw-r--。

另外,linux下(不包含权限掩码umask)规定了文件的默认权限是0666(去除了执行权限x可以减少非常多的攻击,因为很多病毒文件如果创建出来没有执行权限的话,就失去了意义),目录的默认权限是0777。所以,我们如果新建一个文件,文件权限还要和权限掩码umask按位相与,即0666 & ~0002 = 0664(我的电脑上),最后得到的0664(rw-rw-r--)才是文件的真正权限,同理,创建一个目录(0777 & ~0002 = 0775,即rwxrwxr-x)也一样:

我们可以用umask命令来改变权限掩码的值,相应的,我们创建的文件也会要和umask按位相与,会少相对应的部分权限:

相应的,c也有个umask函数,我们用c也可以查看和改变umask的值,但是,修改的仅仅是调用umask()这个函数的进程的值,也就是其余的umask值不变,我们可以用shell命令umask查看一下,会发现umask还是原来的值,所以在c语言里面调用的umask只会改变调用进程的umask。查看man帮助手册可以知道,fork出来的子进程也会继承父进程的umask,也就是说父进程如果修改了权限掩码为0001,那么fork得到的子进程将会和父进程保持一直的权限掩码0001而不是系统的0002或者0022。

当我们用c语言的open(linux的系统函数)来创建一个新文件的时候(即第二个参数指定O_CREAT),我们一定要指明第三个参数的权限是什么,默认的权限并不是linux默认的0666,所以不指定的话我也不知道是什么(感觉每次创建的都不一样?)。因此,保险起见,我们在用open创建一个文件的时候,就按照自己的需求(没有的话就按照linux默认的0666)指定创建的文件权限,而制定了这个权限以后,还要和当前进程的权限掩码按位相与,这样才会得到最终的文件权限。

O_CREAT

    If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file is created; the user ID of the file is set to the effective user ID of the process; the group ID of the file is set to  the group ID of the file's parent directory or to the effective group ID of the process;  and the access permission bits (see <sys/stat.h>) of the file mode are set to the value of the third argument taken as type mode_t modified as follows: a bitwise-AND is performed on the file-mode bits and the corresponding bits in the complement of the process' file mode creation mask. Thus, all bits in the file mode whose corresponding bit in the file mode creation mask is set are cleared. When bits other than the file permission bits are set, the effect is unspecified. The third argument does not affect whether the file is open for reading, writing or for both.

linux下创建文件的文件权限问题的更多相关文章

  1. linux下创建的符号链接的权限

    今天为shell脚本创建符号链接的时候突然发现的, 创建的符号链接文件的默认权限是 777, 而想要这个脚本可执行, 必须为真正的文件加上 x 权限才可以.

  2. Linux下遍历目录及文件,更改权限

    Linux下遍历目录及文件,更改权限 引言: 我在Linux下搭建android时,将eclipse及sdk复制到/usr/下时,总会出现无法读,无法写写样的问题. 解决方案: 有两个方案: 一.将复 ...

  3. linux下为目录和文件设置权限

    摘:linux下为目录和文件设置权限 分类: Linux2012-05-09 03:18 7456人阅读 评论(1) 收藏 举报 linuxwordpressweb数据库serverfile linu ...

  4. Linux下创建与解压tar, tar.gz和tar.bz2文件及压缩率对比 | 沉思小屋

    刚 在qq群里面一位仁兄问到文件压缩的命令,平时工作中大多用解压缩命令,要是遇到压缩就现查(这不是一个好习惯),于是整理下Linux下创建与解压 zip.tar.tar.gz和tar.bz2文件及他们 ...

  5. Linux下创建可执行bin安装文件

    需求及应用场景 1.简化操作.一般的软件安装过程,如果想要精简步骤,我们一般会将需要在命令行中输入的命令写成一个脚本,同时将安装介质准备好.我们将脚本和安装介质上传到生产环境,然后通过执行脚本来完成安 ...

  6. linux下php上传文件注意

    linux下php上传文件注意1.修改上传目录权限linux 修改某目录下所有所有子目录权限chmod -R 777 html修改某目录为任何用户都用写读执行权限chmod a+rwx html2.设 ...

  7. linux下恢复误删除的文件方法(ext2及ext3)

     linux下恢复误删除的文件方法(ext2及ext3) 2009-12-19 15:23:47 分类: LINUX 如果是ext2文件系统的,直接用debugfs是可以恢复出来的,但对于ext3,d ...

  8. Linux 下 Vi 配置文件 .vimrc 文件

    Linux 下 Vi 配置文件 .vimrc 文件 配置 vim 的方法是在用户主目录下建立个.vimrc文件,我一般使用root帐户,所以就在/root/下建立一个.vimrc文件:vi /root ...

  9. Linux下利用ssh远程文件传输 传输命令 scp

    在linux下一般用scp这个命令来通过ssh传输文件. 一.scp是什么? scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进 ...

  10. linux下如何执行.sh文件 【转】

    Linux下如何运行.sh文件 是UNIX/LINUX 操作系统的脚本文件,SHELL文件. 本文转载自 http://whitepoplar.javaeye.com/blog/431967 Linu ...

随机推荐

  1. Android仿QQ空间发表动态

    效果展示图: 功能描述:用户点击+会进入发表动态的界面,发表成功后跳转到个人首页. 后续完善:增加个人头像的上传,对界面进行优化,增加点赞和评论的功能. 主要采用listview对内容进行展示,对sq ...

  2. Artix Linux作业系统的使用~

    Artix(阿蒂克斯)Linux 与Gentoo(贱兔) Linux真是夫唱妇随.由于Artix(阿蒂克斯)逃离Systemd,投入到了openrc温暖的怀抱,从而使得每安装一个软体,你还得额外为其安 ...

  3. CDI 组件拦截器的使用和学习

    拦截器的作用原理: 声明拦截器,加@Interceptor注解 方法有二: 1)为拦截器添加Qualifier: 2)不添加Qualifier.为拦截器添加具体的拦截方法,该方法加@AroundInv ...

  4. PHP的可变变量与可变函数

    什么叫可变.在程序世界中,可变的当然是变量.常量在定义之后都是不可变的,在程序执行过程中,这个常量都是不能修改的.但是变量却不同,它们可以修改.那么可变变量和可变函数又是什么意思呢?很明显,就是用另一 ...

  5. win10连接mysql提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    win10中cmd连接mysql提示:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YE ...

  6. CF461D-Appleman and Complicated Task【并查集】

    正题 题目链接:https://www.luogu.com.cn/problem/CF461D 题目大意 \(n*n\)的网格需要填上\(x\)或\(o\),其中有\(k\)个格子已经固定,求有多少中 ...

  7. 宝塔Linux面板搭建与安全狗安装(WEB服务器搭建与WAF安装)

    环境 系统:CentOS 7.3 (64位) 软件: 宝塔Linux 7.7 网站安全狗Linux-Apache版V2.3.18809(64位) 宝塔面板 下载和安装 网址:https://www.b ...

  8. WCF服务调用超时错误:套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“00:05:30”(已解决)

    问题: 线上正式环境调用WCF服务正常,但是每次使用本地测试环境调用WCF服务时长就是出现:套接字连接已中止.这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的.本地套接字超 ...

  9. Java通过socket和DTU,RTU连接工业传感器通信

    现在做DTU传感器监测数据一块,给大家分享如何通过socket技术连接到DTU,并能和DTU下面的传感器通信的,分享一下自己的心得和体会. 总体架构图 先来看下整体网络结构图. 工业名称解释 传感器: ...

  10. 山顶点提取(ArcPy实现)

    一.背景 山顶点指哪些在特定邻域分析范围内,该点都比周围点高的区域.山顶点是地形的重要特征点,它的分布与密度反映了地貌的发育特征,同时也制约着地貌发育.因此,如何基于DEM数据正确有效的提取山顶点,在 ...