【问题标题】:How to set output file mode permissions (rw-rw-rw-)如何设置输出文件模式权限(rw-rw-rw-)
【发布时间】:2014-11-16 01:51:22
【问题描述】:

我创建的代码应该能够复制用户建议的文件。我想知道的是:如何设置输出文件模式以及如何确定此代码中的输出文件模式权限?

#include <stdio.h>
#include <stdlib.h>

int main()
{
char c;
char source_file, target_file;
FILE *in, *out;

printf("Enter name of file to copy\n");
   gets(source_file);
printf("Enter name of file to copy to\n");
  gets(target_file);
in = (source, O_RDONLY);
out = (target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);

/* error handing */
if( in == NULL )
{
   printf("Error. \n");
   exit(0);
}

printf("Enter the copied file name \n");
gets(target_file);

out = fopen(target_file, "w");

/*error handing*/
if( out == NULL )
{
  fclose(in);
  printf("File opening error.\n");
  exit(0);
}

while(( c = fgetc(in) ) != EOF )
  fputc(c,out);

fclose(in);
fclose(out);

return 0;
}

【问题讨论】:

  • 提示:您已经知道如何更改模式,您将其作为此问题的标签之一。另一方面,要获得文件权限,请使用stat
  • 这会不会像在我关闭文件之前在某处添加 chmod(out, 666) 一样简单?
  • 除了chmod 不接受FILE* 参数。相反,您可以将fchmodfileno 结合使用。
  • 请不要使用gets(),即使是在玩具程序中。它是致命的;这是一个非常不好的习惯。请改用fgets()

标签: c output chmod


【解决方案1】:

使用标准 I/O 控制文件权限

标准 I/O 库的一个缺点是您无法控制所创建文件的权限,主要是因为此类权限是特定于平台的(无论如何,比 C 标准所允许的要多)。 POSIX open() 函数允许您在创建文件时控制文件的权限。

对于类似 POSIX 的系统,您可以使用 chmod()fchmod() 系统调用。您需要知道您的 rw-rw-rw- 模式是八进制 0666。

chmod(target_file, 0666);
fchmod(fileno(out), 0666);

函数可能会失败;你应该检查他们没有。

您还可以使用umask() 函数或(小心)umask 命令来影响默认权限。例如,在 shell 中设置umask 022 意味着不会创建可被组或其他人写入的文件。


修改修改后的代码

  1. 您无需担心打开以供读取的文件的权限(或者,至少,您很少需要这样做)。
  2. 担心写入文件的权限比较正常。
  3. 您当前的代码建议是:

    in = (source, O_RDONLY);
    out = (target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
    

    这不会调用open(),并为两个FILE * 变量分配一个整数值,这应该会生成编译器警告。请注意,逗号表达式先计算 LHS,然后再计算表达式的 RHS,将 RHS 作为整体值。 O_RDONLY 通常为 0; S_IRUSR等项的组合不为零。

如果您要使用这些选项打开文件,那么您需要以下内容:

int fd_i = open(source_file, O_RDONLY);
if (fd_i < 0)
    …report error opening source_file…
FILE *in = fdopen(fd_i, "r");
if (in == 0)
    …report error creating file stream for source_file…

int fd_o = open(target_file, O_CREAT|WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if (fd_o < 0)
    …report error opening target_file…
FILE *out = fdopen(fd_o, "w");
if (out == 0)
    …report error creating file stream for target_file…

但是,我可能不会将fdopen() 用于输入文件——我会像你最初那样直接使用fopen()——但我可能会将它用于输出文件。

【讨论】:

  • 将打开命令更改为:out = open(target_file, O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);也可以吗?
  • @user1021170: sorta - 它会创建具有正确权限的文件,但文件描述符将打开以供读取(您需要O_CREAT|O_WRONLYO_CREAT|O_RDWR)。您还将有一个文件描述符而不是文件流指针(int 而不是 FILE *)。您需要使用 fdopen() 将文件描述符转换为文件流指针,或者您需要更改后续代码以使用使用文件描述符而不是文件流的 I/O 调用。
  • 我更新了代码以反映您的回复。我需要对文件流指针做些什么特别的事情吗?
  • @user1021170:查看修改后的答案。
猜你喜欢
  • 2018-04-05
  • 2021-05-13
  • 2015-05-27
  • 2013-01-11
  • 1970-01-01
  • 2019-06-01
  • 2018-12-01
  • 1970-01-01
  • 2013-03-14
相关资源
最近更新 更多