iOS 命名管道,在 ObjC 中工作,在 Swift 中不起作用,相同的代码

rya*_*don 1 system darwin named-pipes ios swift

我一直在尝试在 iOS 中使用命名管道,但在 Swift 中似乎基本上相同的代码会失败,而在 ObjectiveC 中却可以工作。

在 Swift 中,用于写入的 FileHandle 返回 nil,或者如果我使用 FileHandle(forWritingAt: URL) API,它会抛出 Permission Denied。在 Objective C 中,数据通过管道成功发送并记录。

这两个中的路径完全相同。Objective C 示例中的数据也是“hello”.data(using: .utf8),尽管传递到了函数中。

迅速

  do {
    try FileManager.default.removeItem(at: url)
  } catch let error {
    print("error deleting", error)
  }

  mkfifo(url.path, 0777)
  DispatchQueue.main.async {
    let fileHandle = FileHandle(forWritingAtPath: url.path)
    fileHandle?.write("hello".data(using: .utf8)!)
  }

  let fileHandle = FileHandle(forReadingAtPath: url.path)
  if let data = fileHandle?.availableData {
    print(String(data: data, encoding: .utf8))
  }
Run Code Online (Sandbox Code Playgroud)

目标C

  remove(path.UTF8String);
  mkfifo(path.UTF8String, 0777);
  dispatch_async(dispatch_get_main_queue(), ^{
    NSFileHandle *fileHandle=[NSFileHandle fileHandleForWritingAtPath: path];
    [fileHandle writeData:data];
  });

  NSFileHandle *fileHandle=[NSFileHandle fileHandleForReadingAtPath: path];
  NSData* read = fileHandle.availableData;
  NSLog([[NSString alloc] initWithData: read encoding: NSUTF8StringEncoding]);
Run Code Online (Sandbox Code Playgroud)

这些应该只是调用 Objective C 函数吧?为什么他们会有不同的行为?XCode 11.3、iOS 13

vad*_*ian 6

Swift 有八进制吗?我不这么认为。
Swift 没有八进制

恐怕 Swift 确实八进制数,请参阅整数文字

mkfifo(url.path, 0o777)
Run Code Online (Sandbox Code Playgroud)