2011-05-16 115 views
1

我有一个应用程序调用NSTask,(我写了NSTask和应用程序代码)和NSTask在我想要写一行的地方调用NSLog出到控制台。NSTask +调用NSLog在任务结果双重打印消息到控制台

问题是,我看到控制台消息从NSTask,然后我看到由调用过程的消息输出相同,具有双重头...

5/16/11 5:50:01 PM theNSTask[7934] BLAH BLAH BLAH 
[0x0-0x256256].com.someid[7505] 2011-05-16 17:50:01.708 theNSTask[7934:903] BLAH BLAH BLAH 

超级混乱只读取所希望的输出(等等等等等等)。有没有修复这个问题的魔法设置?

感谢,

--Tom

NSTask* task = [[NSTask alloc] init]; 
NSString* path = [[NSBundle mainBundle] pathForAuxiliaryExecutable:@"theNSTask"]; 
[task setLaunchPath:path]; 
NSMutableArray* arguments = [NSMutableArray array]; 
// get the dict as base64 string (start with binary plist): 
NSString* base64Dict = [[self class] base64FromDictionary:message]; 
    [arguments addObject:base64Dict]; 
    [task setArguments:arguments]; 
[task launch]; 

[self.runningTasks addObject:task]; 
[task release]; 

回答

5

我的猜测是,任务直接登录邮件到控制台,并到其标准输出,默认情况下是相同的流作为父进程的标准输出,这是您的应用发送到控制台的标准输出。

如果这是真的,那么你应该能够通过设置任务的标准输出,以解决它/dev/null,如:

NSFileHandle *nullFileHandle = [NSFileHandle fileHandleWithNullDevice]; 
[task setStandardOutput:nullFileHandle]; 
[task setStandardError:nullFileHandle]; 
+0

感谢 - 我走上了正确的道路。无论出于何种原因,我不得不调用setStandardError:nullFileHandle]。另外我不认为我必须关闭空文件句柄,因为它是一个自动释放的对象,也没有实际的文件关闭? – 2011-05-18 14:43:42

+0

我猜测控制台日志记录来自标准错误,而不是标准输出或除标准输出外。另外,我认为你是对的,不需要关闭文件描述符;我误解了[参考]中的这句话(http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileHandle_Class/Reference/Reference.html#//apple_ref/occ/clm/ NSFileHandle/fileHandleWithNullDevice):“文件句柄拥有其关联的文件描述符并负责关闭它。” – 2011-05-18 14:52:48

相关问题