【问题标题】:access mode in mkdir() sys call linux cmkdir() sys 调用 linux c 中的访问模式
【发布时间】:2016-10-03 12:27:59
【问题描述】:

我有一部分代码

if(mkdir(name, 0666/*permission*/) == -1)
            {
                        printf("ERROR");
                        return ERROR;
            }

新创建的目录看起来像

drw-rw-r-- 2 atg atg  4096 Oct  3 17:54 f,,,

但我希望它对其他人具有写入权限,即drw-rw-rw-

当我尝试进入目录时,使用cd,我得到

bash: cd: f: 权限被拒绝

如果我用执行权限创建它,像这样:

if(mkdir(name, 0777/*permission*/) == -1)
                {
                            printf("ERROR");
                            return ERROR;
                }

我明白了

drwxrwxr-x 2 atg atg  4096 Oct  3 18:00 f

我可以使用cd 进入目录。

if(mkdir(name, 0777/*permission*/) == -1)
            {
                        printf("ERROR");
                        return ERROR;
            }

我明白了

dr-xr-xr-x 2 atg atg 4096 Oct 3 18:02 f

为什么没有设置写权限?

我用 chmod 作为

case RD_WRT_DATA:
                            permission = 0666;
                            break;

   if(mkdir(name, permission) == -1)
    {
                printf("ERROR");
                return ERROR;
    }

    else
    {
        return SUCCESS;
    }
    if(chmod(name, permission) == -1)
    {
         printf("ERROR");
         return ERROR;

    }
    else
    {
        return SUCCESS;
    }

已检查 umask:

grep UMASK /etc/login.defs

UMASK       022

我得到的权限仍然是->

drw-rw-r-- 2 atg atg  4096 Oct  3 18:15 f

我应该更换umask吗?不这样做有什么替代方法吗?

【问题讨论】:

  • 但是需要的权限是drw-rw-rw- - 你确定吗?这意味着没有人可以访问目录中的任何内容。你需要x 来访问目录的内容(如果你知道那里有什么),并且需要r 来列出内容,但是没有xr 几乎没用
  • 您应该使用perror(name);(而不是printf("ERROR"); ....)进行错误处理

标签: c linux mkdir


【解决方案1】:

不能列出没有可执行权限的目录。

除了设置umask(0),创建模式为0777的目录。

【讨论】:

    【解决方案2】:

    进程的umask 值屏蔽了非所有者的写入权限。见https://en.wikipedia.org/wiki/Umask

    在计算中,umask 是一个命令,用于确定 控制如何为新创建的文件权限设置的掩码 文件。它也可以指一个设置掩码的函数,或者 它可以 指掩码本身,正式称为文件模式 创作面具。掩码是一组位,每个位限制 如何为新创建的文件设置相应的权限。

    umask 值对于进程是全局的。因此调用umask() 将影响进程中运行的所有线程,以及更改值后产生的所有子进程。

    为了安全地确保文件或目录权限而不影响其余进程,您需要使用chmod() 显式设置权限:

    int rc;
    mode_t mode = 0777;
    
    rc = mkdir( name, mode );
    if ( 0 == rc )
    {
        rc = chmod( name, mode );
    }
    .
    .
    .
    

    如果你真的想改变umask(),最好将它设置为你需要的,然后恢复它

    mode_t old_mask = umask( 0 );
    int rc = mkdir( name, 0777 );
    umask( old_mask );
    

    【讨论】:

    • 请注意,在多线程应用程序中更改和恢复 umask 仍然不安全,因为在此期间其他线程将使用修改后的 umask。
    【解决方案3】:

    尝试调用

    umask(0);
    

    mkdir之前,因为umask对新建目录的权限有影响。

    【讨论】:

      【解决方案4】:

      大多数 linux 发行版使用默认的umask = 022。这意味着当您使用权限777 调用mkdir 时,您将获得权限:777(asked) - 022(umask) = 0755(actual)。实际上,umask应该从新创建的文件/目录中删除哪些权限,其中每个八进制数字表示:

      0 : read, write and execute
      1 : read and write
      2 : read and execute
      3 : read only
      4 : write and execute
      5 : write only
      6 : execute only
      7 : nothing
      

      创建umask(0),您将在创建的目录上获得777 的权限。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 2016-07-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多