我有这个任务,部分需要创建一些名为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
}
}
答案 0 :(得分: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
。我个人觉得octal更容易阅读,但你可能更喜欢其他符号。
将通过删除umask中设置的位来修改已创建文件的权限。如果您确实需要权限为0222,而不是0200,则有两种方法:
#include <sys/stat.h>
int fdes;
fdes = open(str2, O_WRONLY|O_CREAT, 0222);
if (fdes < 0) abort();
fchmod(fdes, 0222);
#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);