我使用NSTask來運行shell命令並通過NSPipe輸出數據。起初,我使用波紋管方法來讀取輸出數據,這沒有任何問題。NSTask:爲什麼程序在從NSPipe讀取時被阻塞?
- (void)outputAvailable:(NSNotification *)aNotification {
NSString *newOutput;
NSMutableData *allData = [[NSMutableData alloc] init];
NSData *taskData = nil;
if((taskData = [readHandle availableData]) && [taskData length])
newOutput = [[NSString alloc] initWithData:allData encoding:NSASCIIStringEncoding];
NSLog(@"%@", newOutput);
[readHandle readInBackgroundAndNotify];
}
該方法的問題是它只輸出4096字節的數據。所以我用while
循環,以獲得更多的數據,修改方法如下:發生
- (void)outputAvailable:(NSNotification *)aNotification {
NSString *newOutput;
NSMutableData *allData; //Added.
NSData *taskData = nil;
while ((taskData = [readHandle availableData]) && [taskData length]) {
[allData appendData:taskData];
}
newOutput = [[NSString alloc] initWithData:allData encoding:NSASCIIStringEncoding];
NSLog(@"%@", newOutput);
[readHandle readInBackgroundAndNotify];
}
然後的問題:程序在while
循環阻塞,不能執行以下語句。我確保allData
是我想要的,但在追加最後一個數據塊後,它會被阻塞。 你能給我一些解決方案嗎?謝謝。
我真的不明白,對不起。你能提供任何代碼來證明它嗎?謝謝。 –
你說'while'循環blokcs進一步的通知。但是'while'循環通過塊接收所有的數據塊,也就是說,數據完全由'while'循環接收。阻塞只發生在最後一個塊數據(<4096bytes)接收之後。 –
@bbbum,感謝您的幫助。現在我知道爲什麼。不幸的是,我不能退出後臺任務,因爲我的應用程序想要與shell交互(例如通過管道啓動sh和輸入命令)。至於第二種方法,我不知道何時以及如何檢測數據量。我找到了一個[示例](http://dev.notoptimal.net/2007/04/nstasks-nspipes-and-deadlocks-when.html),它討論了該問題的解決方案,但它對我無效。我需要你的進一步幫助。再次感謝。 –