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

首先权限掩码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. JAVA修饰符优先级先后顺序规范

    在实际的开发中,会遇到定义静态常量时,有的人使用的修饰符顺序不一致,例如 ... static final ... 或者 ... final static ... 于是找到了下规范,分享下 优先级 修 ...

  2. Eclipse中快速生成Javabean的方法

    总结一下: 先写出属性 无参构造器:Alt+/ 再按回车 全参构造器:Alt+Shift+S 再按字母O键 再按回车 toString方法:Alt+Shift+S 再按字母S键 再按回车 get/se ...

  3. 01-mysql必知必会

    概述 主键:唯一区分表中每个行(不可重复,不允许null mysql:基于客户-服务器的数据库系统 使用mysql mysql是部署在主机上的,可以通过ssh建立mysql连接 # 显示数据库 sho ...

  4. 在PHP中检测一个类是否可以被foreach遍历

    在PHP中,我们可以非常简单的判断一个变量是什么类型,也可以非常方便的确定一个数组的长度从而决定这个数组是否可以遍历.那么类呢?我们要如何知道这个类是否可以通过 foreach 来进行遍历呢?其实,P ...

  5. disruptor笔记之一:快速入门

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  6. Jmeter扩展组件开发(9) - 解决空指针问题

    问题分析 上一节https://www.cnblogs.com/gltou/p/14967005.html功能描述内容为空,导致Jmeter报空指针 CODE List desc = new Arra ...

  7. javascript 求最大前5个数; 对象 深拷贝 deep copy

    * 用数组 function getTopN(a, n) { function _cloneArray(aa) { var n = aa.length, a = new Array(n); for ( ...

  8. MySQL update 链表 (一个表数据当做条件错误时候的转换)

    MySQL语句一: UPDATE lesson_p set solve_status = 6 where lesson_p_id in (SELECT lp.lesson_p_id FROM `les ...

  9. libcurl 概述(翻译)

    l名称 libcurl 客户端 URL 传输 描述 这是一个如何使用libcurl进行C语言编程的简短概述.这里提到的每个功能都有特定的手册页.还有 libcurl-easy 手册页,libcurl- ...

  10. 鸿蒙内核源码分析(信号生产篇) | 信号安装和发送过程是怎样的? | 百篇博客分析OpenHarmony源码 | v48.03

    百篇博客系列篇.本篇为: v48.xx 鸿蒙内核源码分析(信号生产篇) | 年过半百,依然活力十足 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管 ...