我正在使用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);

我的问题是第三个参数。在任何情况下,它都能保证得到与NSData常规writeToFile:方法完全相同的许可,这是“正确”的吗?
我想在使用普通的open()而不是使用Cocoa的方法来写文件时获得适当的“默认”权限。
我发现上面的权限(rw rw-)可以工作,因为umask实际上将它们降为(rw-r--)。但我的问题是:这总是有保证的吗?我的第三个参数应该是什么?

最佳答案

我们可以使用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

十六进制0x1B6是八进制0666。

09-07 13:24