2015-10-19 1 views
1

В моем коде, у меня есть следующий фрагмент:Попытки создать файл в C с полными правами для всех

char* filename="/something.txt"; 
umask(0); 
int filehandle=open(filename,O_WRONLY|O_CREAT|0x777); 
close(filehandle); 

После его выполнения, файл создается, но разрешения не установлены правильно, даже если я последовал документацию.

Документация гласит:

Режим аргумент определяет права доступа для использования в случае, если новый файл CRE-ованные. Он модифицируется umask процесса обычным способом: разрешения созданного файла (режим & ~ umask).

и для режима я указал 0x777, что означает чтение, запись и выполнение. для UMASK, я указал ноль так 0x777 & ~0 должно привести к 777.

Разрешения, которые на самом деле являются результатом являются 670.

Почему так и как это исправить?

+0

попробуйте открыть (имя файла, O_WRONLY | O_CREAT, 0x777); вместо open (имя_файла, O_WRONLY | O_CREAT | 0x777); –

+0

'int filehandle = open (имя файла, O_WRONLY | O_CREAT | 0x777);' неверно. 'mode' - отдельный аргумент для' open() 'и должен быть' 0777', а не '0x777'. – EOF

+0

ok оба предложения в сочетании сработали для меня. Благодарю. – Mike

ответ

3

Для начала, он должен быть восьмеричное 0777, а не шестигранной 0x777, то Эквиваленты являются:

0x777 0111 0111 0111 011 101 110 111 r-xrw-rwx, plus other stuff(a) 
0777 111 111 111   111 111 111 rwxrwxrwx 

Во-вторых, подпись:

int open(const char *pathname, int flags, mode_t mode); 

означает, что режим является отдельный аргумент, а не то, что вы or с флагами.

Поэтому линия вы ищете будет:

int filehandle = open (filename, O_WRONLY | O_CREAT, 0777); 

(а) Я считаю, что POSIX оставляет эти старшие биты не определено, но Linux будет использовать их, чтобы указать, что файл был setgid и sticky (хотя не в оригинальном смысле код липкого значения хранился в кэше в пространстве подкачки - Linux никогда не поддерживал это, вместо этого использовал липкий бит, чтобы ограничить, кто может выполнять определенные операции над файлами в липкой директории).

Смежные вопросы