如何设置输出文件模式权限(rw-rw-rw-)

时间:2014-09-22 07:01:59

标签: c output chmod

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

#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;
}

1 个答案:

答案 0 :(得分:3)

使用标准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等术语的组合不为零。

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

    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() - 但我可能会将其用于输出文件。