不想创建写保护

时间:2013-03-29 22:43:47

标签: c

我有这个任务,部分需要创建一些名为xNNNNNN的文件,其中NNNNNN被一个随机的六位数字替换,文件应该按照生成其名称的随机顺序创建,我已经这样做但问题是我得到的文件是写保护但我希望它们只写,我做错了什么?它与旗帜或其他东西有关吗?

这是我写的:

  int file;
  int fileName;
  int counter;
  char str1[5];
  char str2[5];
  int fileNum = atoi(argv[2]);

  for (counter = 0; counter < fileNum ; counter++)
  {
     fileName = rand() % 900000 + 100000; 

     sprintf (str1, "%d", fileName); //write the value of r as a string in str
     sprintf (str2, "%s%s", "x", str1);
     printf ("%s\n" ,str2); 

     file = open (str2, O_WRONLY|O_CREAT, S_IRUSR | S_IRGRP | S_IROTH); 
     if (file != -1)
     {
         //do something 
     } 
  }

1 个答案:

答案 0 :(得分:4)

您希望它们是只写的,但您将只读权限传递给open()

file = open (str2, O_WRONLY|O_CREAT, S_IRUSR | S_IRGRP | S_IROTH);

此处的权限为S_IRUSR | S_IRGRP | S_IROTHO_WRONLY标志用于文件描述符本身的权限,而不是对创建文件的权限。

这样做你想要的:

file = open(str2, O_WRONLY|O_CREAT, 0222);

请注意0222 = S_IWUSR | S_IWGRP | S_IWOTH。我个人觉得octal更容易阅读,但你可能更喜欢其他符号。

关于umask的注意事项

将通过删除umask中设置的位来修改已创建文件的权限。如果您确实需要权限为0222,而不是0200,则有两种方法:

打开文件后更改权限

#include <sys/stat.h>

int fdes;
fdes = open(str2, O_WRONLY|O_CREAT, 0222);
if (fdes < 0) abort();
fchmod(fdes, 0222);

更改流程umask

#include <sys/stat.h>

mode_t saved_umask;
int fdes;
saved_umask = umask(0);
fdes = open(str2, O_WRONLY|O_CREAT, 0222);
umask(saved_umask);