Использование open () таким образом, чтобы разрешение на файл было гарантировано таким же, как и у файлов, записанных с использованием методов записи файлов NSData. - PullRequest
0 голосов
/ 14 декабря 2011

Я сейчас использую open() для записи файла следующим образом:

NSString *path = @"/Users/enchilada/Desktop/file.txt";
int fd = open([path fileSystemRepresentation],
              O_EXCL | O_CREAT | O_WRONLY,
              S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);

Моя проблема - третий параметр.Является ли он «правильным» в том смысле, что он гарантированно дает то же самое разрешение при любых обстоятельствах, что и обычные writeToFile: методы NSData?

Я хочу получить соответствующие разрешения «по умолчанию» при использованиипросто open() вместо использования методов Какао для записи файлов.

Я обнаружил, что вышеупомянутые разрешения (rw-rw-rw-) работают, потому что umask фактически отключает их к (rw-r - r--).Но мой вопрос: всегда ли это гарантировано?Каким должен быть мой третий параметр?

Ответы [ 2 ]

2 голосов
/ 15 декабря 2011

Мы можем узнать, используя dtruss. Вот моя тестовая программа:

#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
    @autoreleasepool {
        [[NSData dataWithBytes:"hello\n" length:6] writeToFile:@"/tmp/data.out" atomically:NO];
    }
    return 0;
}

Вот мой журнал пробежек:

$ sudo dtruss ~/Library/Dev*/Xcode/De*/datatest-*/B*/P*/D*/datatest 2>&1 | fgrep data.out
open("/tmp/data.out\0", 0x601, 0x1B6)        = 3 0

Hex 0x1B6 является восьмеричным 0666.

2 голосов
/ 15 декабря 2011

Да, 0666 является правильным (по крайней мере, для iOS 5), но 2-й аргумент будет O_CREAT | O_TRUNC | O_WRONLY, если вы не пишете атомарно (и O_CREAT | O_EXCL | O_RDWR во временный файл, если пишете атомарно.)

На самом деле вы можете запустить вашу программу в отладчике, установить точку останова на open, а затем проверить 3-й аргумент (p/o $r2 в gdb для ARM), чтобы убедиться.

...