iOS命名管道,在ObjC中工作,在Swift中不工作,代码相同
我一直在尝试在iOS中使用命名管道,但在ObjectiveC中,Swift中的代码基本上失败了 在Swift中,用于写入的FileHandle返回为nil,或者如果我使用FileHandleforWritingAt:URL API,它抛出一个被拒绝的权限。在目标C中,数据通过管道成功发送并记录 两者的路径完全相同。Objective C示例中的数据也是hello.datausing:.utf8,但已传递到函数中 迅捷的 目标CiOS命名管道,在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
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应用程序试图写入命名管道时,它就会挂起。你能发布工作代码吗?