2011-05-16 110 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

相關問題