1

私はこの課題を持っています。その一部は、xNNNNNN という名前のファイルを作成する必要があります。ここで、NNNNNN はランダムな 6 桁の数字に置き換えられ、ファイルは名前が生成されるランダムな順序で作成される必要があります。すでにそれを行っていますが、問題は、取得したファイルが書き込み保護されていることですが、それらを書き込み専用にしたいのですが、何が間違っていますか?? それは旗や何かに関連していますか?

ここに私が書いたものがあります:

  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

You want them to be write-only, but you pass read-only permissions to open():

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

The permissions here are S_IRUSR | S_IRGRP | S_IROTH. The O_WRONLY flag is for permissions on the file descriptor itself, not permissions on the created file.

This does what you want:

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

Note that 0222 = S_IWUSR | S_IWGRP | S_IWOTH. I personally find octal much easier to read, but you may prefer the other notation.

Note about umask

Permissions on created files will be modified by removing bits set in the umask. If you really need the permissions to be 0222, and not, say, 0200, there are two ways:

Change the permissions after opening the file

#include <sys/stat.h>

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

Change the process 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 に答える