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

iOS命名管道,在ObjC中工作,在Swift中不工作,代码相同,ios,swift,system,named-pipes,darwin,Ios,Swift,System,Named Pipes,Darwin,我一直在尝试在iOS中使用命名管道,但在ObjectiveC中,Swift中的代码基本上失败了 在Swift中,用于写入的FileHandle返回为nil,或者如果我使用FileHandleforWritingAt:URL API,它抛出一个被拒绝的权限。在目标C中,数据通过管道成功发送并记录 两者的路径完全相同。Objective C示例中的数据也是hello.datausing:.utf8,但已传递到函数中 迅捷的 目标C remove(path.UTF8String); mkfif

我一直在尝试在iOS中使用命名管道,但在ObjectiveC中,Swift中的代码基本上失败了

在Swift中,用于写入的FileHandle返回为nil,或者如果我使用FileHandleforWritingAt:URL API,它抛出一个被拒绝的权限。在目标C中,数据通过管道成功发送并记录

两者的路径完全相同。Objective C示例中的数据也是hello.datausing:.utf8,但已传递到函数中

迅捷的

目标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]);
这些应该只是调用目标C函数,对吗?为什么他们的行为会有所不同?
XCode 11.3,iOS 13

@gnasher729是正确的-Swift没有八进制,所以0777是错误的。我将八进制转换为十六进制,并将文本替换为0x1FF@gnasher729是正确的-Swift没有八进制,因此0777是错误的。我将八进制转换为十六进制,并将文本替换为0x1FF


斯威夫特有八进制数吗?我不这么认为。 斯威夫特没有八进制

恐怕斯威夫特有八进制数字,明白吗


斯威夫特有八进制数吗?我不这么认为。 斯威夫特没有八进制

恐怕斯威夫特有八进制数字,明白吗


我从这里经过,我正在寻找swift中命名管道通信的完整解决方案。 这是我最后能做的

private let path = "/tmp/myfifo"
func listen() {
        DispatchQueue.global(qos: .userInitiated).async { [weak self] in
            let url = URL(fileURLWithPath: self?.path ?? "")
            do {
              try FileManager.default.removeItem(at: url)
            } catch let error {
              print("error deleting", error)
            }

            mkfifo(url.path, 0o777)
            let fileHandle = FileHandle(forReadingAtPath: url.path)
            while true {
                if let data = fileHandle?.availableData {
                    if let readedData = String(data: data, encoding: .utf8), readedData != "" {
                        print(readedData)
                    }
                }
            }
        }
    }
在文件处理程序上发送写操作

   func sendToDeamon(content: String) {
        let handler = FileHandle(forWritingAtPath: "/tmp/myfifo")
        let secData = content.data(using: .utf8)
        if let secData = secData {
            handler?.write(secData)
        }
        handler?.closeFile()
    }

我从这里经过,我正在寻找swift中命名管道通信的完整解决方案。 这是我最后能做的

private let path = "/tmp/myfifo"
func listen() {
        DispatchQueue.global(qos: .userInitiated).async { [weak self] in
            let url = URL(fileURLWithPath: self?.path ?? "")
            do {
              try FileManager.default.removeItem(at: url)
            } catch let error {
              print("error deleting", error)
            }

            mkfifo(url.path, 0o777)
            let fileHandle = FileHandle(forReadingAtPath: url.path)
            while true {
                if let data = fileHandle?.availableData {
                    if let readedData = String(data: data, encoding: .utf8), readedData != "" {
                        print(readedData)
                    }
                }
            }
        }
    }
在文件处理程序上发送写操作

   func sendToDeamon(content: String) {
        let handler = FileHandle(forWritingAtPath: "/tmp/myfifo")
        let secData = content.data(using: .utf8)
        if let secData = secData {
            handler?.write(secData)
        }
        handler?.closeFile()
    }

为什么异步写入句柄,但同步读取?您的ObjC和Swift示例都被破坏了,因为如果写入不接近即时,那么访问ti availableData将发生在写入之前。Swift是否有八进制数?我不这么认为。0777并不是你想象的那样。@gnasher729你是对的-最终使用了0x1FF,它工作了。想要发布一个答案,我可以给你评分吗?@ryangordon,即使将文本更改为0x1FF,我仍然无法让你的最小示例工作。由于某些原因,文件句柄在写入时挂起。^edit:发现问题。我假设您的代码块在主线程上运行,但它可能没有。这是因为只写打开将阻塞,直到另一个进程打开FIFO进行读取。为什么异步写入句柄,但同步读取?您的ObjC和Swift示例都被破坏了,因为如果写入不接近即时,那么访问ti availableData将发生在写入之前。Swift是否有八进制数?我不这么认为。0777并不是你想象的那样。@gnasher729你是对的-最终使用了0x1FF,它工作了。想要发布一个答案,我可以给你评分吗?@ryangordon,即使将文本更改为0x1FF,我仍然无法让你的最小示例工作。由于某些原因,文件句柄在写入时挂起。^edit:发现问题。我假设您的代码块在主线程上运行,但它可能没有。这是因为仅写打开将阻塞,直到另一个进程打开FIFO进行读取。我尝试运行您发布的代码,但由于某些原因,我的iOS应用程序在尝试写入命名管道时挂起。你能发布工作代码吗?我试着运行你发布的代码,但由于某种原因,每当我的iOS应用程序试图写入命名管道时,它就会挂起。你能发布工作代码吗?