cocoa - 在 Cocoa 中将 stdout 重定向到 NSTextView 的最佳方法是什么?

标签 cocoa subprocess stdout

嗨:我想将标准输出重定向到 NSTextView。这也适用于子流程的输出吗?实现这一目标的最佳方法是什么?

编辑: 根据 Peter Hosey 的回答,我实现了以下内容。但我没有收到通知。我做错了什么?

NSPipe *pipe = [NSPipe pipe];
NSFileHandle *pipeHandle = [pipe fileHandleForWriting];
dup2(STDOUT_FILENO, [pipeHandle fileDescriptor]);
NSFileHandle *fileHandle = [[NSFileHandle alloc] initWithFileDescriptor:pipeHandle];
[fileHandle acceptConnectionInBackgroundAndNotify];

NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:self selector:@selector(handleNotification:) name:NSFileHandleConnectionAcceptedNotification object:fileHandle];

最佳答案

我想做同样的事情并发现了这篇文章。在阅读了这篇文章和苹果的文档后我才明白了这一点。我在这里包括我的解决方案。 “pipe”和“pipeReadHandle”在接口(interface)中声明。在 init 方法中我包含以下代码:

pipe = [NSPipe pipe] ;
pipeReadHandle = [pipe fileHandleForReading] ;
dup2([[pipe fileHandleForWriting] fileDescriptor], fileno(stdout)) ;

[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(handleNotification:) name: NSFileHandleReadCompletionNotification object: pipeReadHandle] ;
[pipeReadHandle readInBackgroundAndNotify] ;

handleNotification:方法是

[pipeReadHandle readInBackgroundAndNotify] ;
NSString *str = [[NSString alloc] initWithData: [[notification userInfo] objectForKey: NSFileHandleNotificationDataItem] encoding: NSASCIIStringEncoding] ;
// Do whatever you want with str 

关于cocoa - 在 Cocoa 中将 stdout 重定向到 NSTextView 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406204/

相关文章:

cocoa - NSManagedObject 子类中的自定义 Setter

python - 未找到 subprocess.call 和 os.system 返回

python - 如何将utf-8输出重定向到txt文件

c - 在 C 中将 STDIN、STDOUT、STDERR 重定向到/dev/null

spring - 禁用 Spring 日志,以获得可读日志

cocoa - 如何在 NSArray 中查找字符串?

ios - NSUserDefaults 在同步时崩溃

objective-c - 从 Cocoa/Objective-C 添加新元素到 WebFrame 的 DOM

python - 如何打开可见的全尺寸 Excel?

android - 如何使用子进程写入文件