- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 NSTask,配置了 3 个 NSPipe,并且想要读取 standardOutput 和 standardError。我在 while 内执行此操作 - 第一个用于标准输出,第二个用于标准错误。我不能使用 readInBackgroundAndNotify 和 waitForDataInBackgroundAndNotify,因为我的代码已经在单独的线程中运行,并且我不想在那里运行 NSRunLoop 并分离新的后台线程...但是读取两者 - stdout 和 stderr 会导致在没有可用数据时挂起数据存在于这些 channel 之一。
所以我使用这段代码:
@implementation NSFileHandle (isReadableAddon)
- (BOOL)isReadable
{
int fd = [self fileDescriptor];
fd_set fdset;
struct timeval tmout = { 0, 0 }; // return immediately
FD_ZERO(&fdset);
FD_SET(fd, &fdset);
if (select(fd + 1, &fdset, NULL, NULL, &tmout) <= 0)
return NO;
return FD_ISSET(fd, &fdset);
}
@end
但是,当 isReadable 返回 YES 并且我调用 [fileHandle availableData] 时,我的线程仍然阻塞。为什么?我期望当 isReadable 返回 YES 时调用 availableData 方法而不阻塞。
最佳答案
我也更喜欢使用 select
但如果您想使用非阻塞阅读,这里有一个适合我的要点。
swift 4
var flags = fcntl(fileDescriptor, F_GETFL)
_ = fcntl(fileDescriptor, F_SETFL, flags | O_NONBLOCK)
public var nonBlockingAvailableData: Data? {
return self.__readDataOfLength(Int.max, untilEOF: false)
}
internal func __readDataOfLength(_ length: Int, untilEOF: Bool) -> Data? {
let _closed: Bool = false
let _fd = self.fileDescriptor
var statbuf = stat()
var dynamicBuffer: UnsafeMutableRawPointer? = nil
var total = 0
if _closed || fstat(_fd, &statbuf) < 0 {
fatalError("Unable to read file")
}
if statbuf.st_mode & S_IFMT != S_IFREG {
/* We get here on sockets, character special files, FIFOs ... */
var currentAllocationSize: size_t = 1024 * 8
dynamicBuffer = malloc(currentAllocationSize)
var remaining = length
while remaining > 0 {
let amountToRead = min(1024 * 8, remaining)
// Make sure there is always at least amountToRead bytes available in the buffer.
if (currentAllocationSize - total) < amountToRead {
currentAllocationSize *= 2
dynamicBuffer = reallocf(dynamicBuffer!, currentAllocationSize)
if dynamicBuffer == nil {
fatalError("unable to allocate backing buffer")
}
}
let amtRead = read(_fd, dynamicBuffer!.advanced(by: total), amountToRead)
//Needs better errorhandling, check ERRNO?
if amtRead == -1 {
return nil
}
if 0 > amtRead {
free(dynamicBuffer)
fatalError("read failure")
}
if 0 == amtRead {
break // EOF
}
total += amtRead
remaining -= amtRead
if total == length || untilEOF == false {
break // We read everything the client asked for.
}
}
}
if length == Int.max && total > 0 {
dynamicBuffer = reallocf(dynamicBuffer!, total)
}
if total == 0 {
free(dynamicBuffer)
}
else if total > 0 {
let bytePtr = dynamicBuffer!.bindMemory(to: UInt8.self, capacity: total)
return Data(bytesNoCopy: bytePtr, count: total, deallocator: .free)
}
else {
assertionFailure("The total number of read bytes must not be negative")
free(dynamicBuffer)
}
return Data()
}
参见 Linux select手册页:
Under Linux, select() may report a socket file descriptor as "ready for reading", while nevertheless a subsequent read blocks. This could for example happen when data has arrived but upon examination has wrong checksum and is discarded. There may be other circumstances in which a file descriptor is spuriously reported as ready. Thus it may be safer to use O_NONBLOCK on sockets that should not block.
关于cocoa - 如何检查 NSFileHandle 是否有可用数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7505777/
我只是想知道offsetInFile如何工作?和seekToFileOffSet之间的区别是什么。和您知道的代码示例也会有所帮助:) 最佳答案 对于标准文件描述符,-[NSFileHandle off
所以今天早上我遇到了一个非常奇怪的问题。我有一个 NSMutableString 随着时间的推移不断增长,它偶尔会将自己保存到磁盘,基本上创建一个不断增长的文本文件。直到几个小时前,它一直运行良好。顺
我正在将数据记录到我用 NSFileHandle 打开的文件中。这些日志文件可以通过电子邮件发送出去,我发送电子邮件之前是否需要关闭 NSFileHandle 最佳答案 您不需要关闭文件句柄,但如果您
我正在尝试将从命令行返回的信息作为字符串输入到我的程序中。这是我的代码,我尝试了一些其他变体但没有成功。 let MyTask : NSTask = NSTask() MyTask.l
我只是想读取服务器上的文本文件。用于测试的文件目前是本地的。代码如下: NSString *pathToLocalFile = [NSHomeDirectory() stringByA
我正在使用cocoa,我正在尝试为我正在编写的程序创建一个tcp套接字服务器,我正在使用NSFileHandle和acceptConnectionInBackgroundAndNotify方法。我一直
我正在通过 Cocoa 中的 NSFileHandle 读取控制台应用程序的管道输出。如何刷新与该文件句柄关联的流。如果我可以从 NSFileHandle 获取 FILE* 对象,我可以调用 fflu
我正在使用 NSTask,配置了 3 个 NSPipe,并且想要读取 standardOutput 和 standardError。我在 while 内执行此操作 - 第一个用于标准输出,第二个用于标
我有一个记录器的自定义实现,它记录我的应用程序中的操作和操作。 强NSString引用生活在我的单例类(class)中。 每当我需要记录一些东西时,我都会调用一个名为“-(void)writeToFi
我正在尝试创建一个文件并通过每次点击“保存”按钮时在末尾添加一个字符串来更新该文件。但是,每次我点击“保存”时,它都会使用最新的字符串创建一个新文件(覆盖)。我的代码如下,我该如何修复它?请帮忙! f
我设置了一个文件句柄来读取 stdout 的内容,当我尝试使用 availableData 从其中提取数据时,它会挂起,但仅当应用程序在我的设备上手动运行时才会挂起。当我通过 Xcode 或模拟器在我
我目前正在尝试从另一个应用程序实现打开文件。当我访问第三方应用程序(如文档)并使用我的应用程序打开文件时,我似乎无法使用 NSFileHandle 打开它。 调用 AppDelegates 方法后:
我为 NSFileHandleReadCompletionNotification 设置了一个 NSNotification。 我使用两个独立的管道设置标准 I/O。 NSPipe * input
我有一个循环获取一堆文件的 URL(10 个小的 txt 文件和 1 个大约 700KB 的大图像文件)并运行“getFile”为每个文件创建一个 NSUrlConnection。 当应用程序到达 [
我正在尝试打开一个小文本文件来测试文件上的一些 NSFileHandle 函数。但是我不知道该怎么做,如果你能告诉我我错过了什么,那就太好了。 //.h @interface MainViewCont
我有以下代码来进行方法调配: static inline void swizzleMethod(const char *clsName, const char *mthName, const char
旧的解析器依赖于 FILE * 来工作。但是,适用于 iOS 的 Dropbox Sync API 返回一个 NSFileHandle * 而不是 FILE * 作为文件句柄。 所以我尝试使用 NSF
Apple 说 here “不要将 NSSocketPort (OS X) 或 NSFileHandle 用于一般套接字通信”。 现在我正在努力调试套接字断开连接问题。 如果我们使用 NSFileHa
使用 NSFileHandle,使用 truncateFileAtOffset 从文件末尾删除 n 个字符非常容易。 -(void)removeCharacters:(int)numberOfChar
我有这个权利吗... To manipulate files on disk (create, copy, rename etc.) you use NSFileManager To manipula
我是一名优秀的程序员,十分优秀!