【问题标题】:create file and assign permissions创建文件并分配权限
【发布时间】:2012-12-16 06:31:49
【问题描述】:

似乎无论我作为 PERMS 创建的文件具有相同的权限 - rwx r-x r-x

我尝试了 755 和 777,但权限保持不变。

#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/stat.h>
#define PERMS 0777

int main(int argc, char *argv[])
{
    int createDescriptor;
    char fileName[15]="Filename.txt";

    if ((createDescriptor = creat(fileName, PERMS )) == -1)
    {
        printf("Error creating %s", fileName);
        exit(EXIT_FAILURE);
    }

    if((close(createDescriptor))==-1)
    {
        write(2, "Error closing file.\n", 19);
    }

    return 0;
}

【问题讨论】:

  • 你在使用 Turbo C++ IDE 吗?

标签: c posix file-permissions


【解决方案1】:

我认为您可能需要在调用 creat 之前更改 umask:

umask(0000);

man 2 umask。默认的 umask 通常是 0022,这会使 0777 和 0755 之间的差异消失。

【讨论】:

  • 它现在可以工作,但不仅适用于新创建的文件。如果文件存在,O_CREAT 应该覆盖该文件。在这种情况下,权限保持不变。
  • 正确,这就是它的工作原理。在这种情况下,您需要使用chmod(或fchmod)。
  • 你能解释一下为什么它“继承”了之前被覆盖的同名文件的文件权限吗?我知道有一个结构,其中包含文件的模式。如果文件被覆盖,这个结构中的文件权限是否不会改变?还是有其他原因?
  • 文件没有被删除和重新创建;相反,它只是被截断并保留相同的 inode。从手册页:creat() is equivalent to open() with flags equal to O_CREAT|O_WRONLY|O_TRUNC.
【解决方案2】:

试试chmod 函数。如需更多详情,只需右键单击IDE 并输入chmod

姓名

chmod - 改变文件的模式

概要:

 #include <sys/stat.h>
 int chmod(const char *path, mode_t mode);

描述

chmod() 函数将S_ISUID, S_ISGID, [XSI] S_ISVTX, 和路径参数指向的路径名所命名文件的文件权限位更改为模式参数中的相应位。应用程序应确保进程的有效用户 ID 与文件的所有者匹配,或者进程具有适当的权限才能执行此操作。

S_ISUID, S_ISGID, [XSI] S_ISVTX, 和文件权限位在&lt;sys/stat.h&gt;. 中描述

如果调用进程没有适当的权限,并且文件的组ID与有效组ID或补充组ID之一不匹配,并且如果文件是常规文件,则位S_ISGID(设置-group-ID on execution) 从 chmod() 成功返回后,文件模式中的 -group-ID 将被清除。

其他实现定义的限制可能会导致模式中的S_ISUID and S_ISGID 位被忽略。

在调用 chmod() 时打开的文件对文件描述符的影响是实现定义的。

成功完成后,chmod() 将标记更新文件的 st_ctime 字段。

返回值

成功完成后,返回0;否则,应返回-1 并设置errno 以指示错误。如果返回-1,则不会更改文件模式。 更多信息请访问this 链接。

【讨论】:

    猜你喜欢
    • 2019-11-17
    • 2011-06-12
    • 2019-05-14
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    相关资源
    最近更新 更多