Ошибка «Отказано в доступе» при записи в файл, но только если он еще не существует - PullRequest
1 голос
/ 04 февраля 2012

Мне обычно не нравится задавать вопросы "что не так с моим кодом", но это моя последняя надежда.

Я делаю проект, в котором мне нужно записывать файлы, и я 'Я пытаюсь сделать это с помощью системных вызовов (Linux).Поэтому я использую unistd.h, который обеспечивает функции: int open( char* filename, int flags, int mode ) и int write( int fd, void* ptr, int numbytes ).Я использую write все время без проблем, но обычно это происходит со стандартными дескрипторами файлов ошибок out и standard.

Поэтому я использую этот код для открытия файла:

int flags = O_WRONLY;
if( !exists( "testfile2.txt" ) ) {
    flags |= O_CREAT;
}
int mode = S_IROTH | S_IWOTH | S_IXOTH;
int filedesc = open( "testfile2.txt", flags, mode );

А затем эту строку для записи в файл:

int written = write(filedesc, "abcdefghijklmnopqrstuvwxyz",
    strlen("abcdefghijklmnopqrstuvwxyz" ) );

И, наконец, я закрываю файл с этим:

int closed = close( filedesc );

Проблема в том, что, когда я пытаюсь записать в файлкогда его еще не было, я получаю сообщение «Отказано в разрешении».Когда я открываю его в vi и игнорирую разрешения, файл кажется пустым.Тем не менее, если файл существовал изначально, он записывает в него, и я могу читать его очень хорошо.Кто-нибудь знает, что происходит, или я что-то упускаю?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

В соответствии с документами , O_CREAT использует биты разрешений, только если файл не существует. Вы передаете маску разрешений 007, отказывая «владельцу» и «группе» во всех правах на файл. Используйте не менее S_IRUSR | S_IWUSR в режимах флагов:

x@y:~/tmp$ touch test
x@y:~/tmp$ cat test
x@y:~/tmp$ chmod 007 test
x@y:~/tmp$ cat test
cat: test: Permission denied
1 голос
/ 04 февраля 2012

Вы устанавливаете режим, чтобы давать разрешение другим, но не себе.Просто установите режим = 0777.

...