"穿心莲"函数提供错误的权限

时间:2016-03-19 12:21:01

标签: c unix permissions file-permissions

我的代码如下:

#include "unistd.h"
#include <fcntl.h>

#define BSIZE 50

int main(int argc, char *argv[]) {
    int f1, f2;
    char buf[BSIZE];

    f1 = open(argv[1], 0x0001, 0);
    f2 = creat(argv[2], 0777);

    read(f1, buf, BSIZE);
    write(f2, buf, BSIZE);

    return 0;
}

当我创建一个名为&#39; a&#39;并使用命令

编译程序
./a.out a b

它会创建一个文件,内容为&#39; a&#39;确实。但问题是,它的权限是-rwxr-xr-x。它不会为组和其他人提供写入权限。而且,当我将函数更改为creat(argv[2], 0022);时 那么许可将全部为0 ----------

creat功能有什么问题吗?因为chmod工作正常。

2 个答案:

答案 0 :(得分:2)

文件创建使用两个组合访问权限:

  1. 您通过creatopen
  2. 提供的那个
  3. 和进程掩码,又名umask
  4. umask通过屏蔽一些位来保护程序用户的最终控制,以保护具有一些意外访问的创建文件。一般情况下,umask等于022表示已删除群组和其他群组的写入权限,即用户不要超过rwxr-xr-x

    然后当你收回0777时,它会被~umask 0755屏蔽(和),0755给出022。 当您回复0755时,000屏蔽{和} id | product name | shop Name ---------------------------- 1 | Suger | Ram Store ----------------------------- 2 | Oil | Suraj Store ------------------------------- 3 | Batter | Ram Store ------------------------------ 4 | Maida | Ram Store -------------------------------- 5 | Rice | Ram Store -------------------------------- 6 | Suger | Suraj Store -------------------------------- 7 | Oil | Ram Store -------------------------------- 8 | Rice | Suraj Store

答案 1 :(得分:1)

opencreatfopen等创建的文件使用默认umask屏蔽模式位。您可能有umask 022,这是一个宽松的默认值。将umask更改为0会非常危险。正确的方法是明确使用chmod来覆盖此默认值,并使组成员和其他人可以写入您的文件。