1

我有这个任务,其中一部分需要创建一些名称为 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 
     } 
  }
4

1 回答 1

4

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

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

这里的权限是S_IRUSR | S_IRGRP | S_IROTH. 该O_WRONLY标志用于文件描述符本身的权限,而不是创建文件的权限。

这可以满足您的要求:

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

请注意0222 = S_IWUSR | S_IWGRP | S_IWOTH. 我个人觉得八进制更容易阅读,但您可能更喜欢其他表示法。

关于 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);
于 2013-03-29T22:51:53.347 回答