代码之家  ›  专栏  ›  技术社区  ›  Irad K

从根权限进程创建可访问的文件

  •  0
  • Irad K  · 技术社区  · 6 年前

    但是,由于没有向该命令提供权限,并且根进程首先创建文件,因此其他非根进程无法访问该文件。

    我可以用 int open(const char *pathname, int flags, mode_t mode); 从而控制文件权限(由mode\t表示)以允许每个人访问,但我需要文件描述符( FILE * FILE *fdopen(int fd, const char *mode); 为了进行转换。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Alexander Ryker    6 年前

    open 然后 fdopen chmod 在文件创建后更改文件权限,但这是一种更迂回的方法。

        2
  •  1
  •   Andrew Henle    6 年前

    我可以使用int open(const char*pathname,int flags,mode\u t mode);从而控制文件权限(由mode\u t表示)

    your process's umask setting . 因为权限传递给 open()

    Per POSIX open() (加粗):

    访问权限位(参见 <sys/stat.h> )文件模式的值应设置为以下参数的值: oflag 作为类型的参数 mode_t 修改如下 :对文件模式位和进程文件模式创建掩码补码中的相应位执行按位AND。因此,清除文件模式中其在文件模式创建掩码中的对应位的所有位。

    int fd = open( someFileName, O_CREAT | O_RDWR, 0644 );
    

    是 保证将文件权限设置为 0644 .

    0077 ,则将实际创建该文件,并将权限设置为 0600 .

    请注意 umask() 设置是一个进程范围的属性,对其进行太多更改并不是一个好主意。如果你试图编写没有副作用的通用代码,那么改变它是个坏主意。例如,更改 在多线程进程中设置以允许更广泛地访问正在创建的文件可能会导致

    将文件权限设置为所需权限的最佳方法是将文件权限设置为所需权限 fchmod() :

    FILE *f = fopen(...);
    fchmod( fileno( f ), 0644 );
    

    事实上,自从 umask() 因此,通过以下方式显式设置权限: chmod() 或 fchmod() .