NSTask oddity with getting stdout
NSTask oddity with getting stdout
- Subject: NSTask oddity with getting stdout
- From: Scott Ribe <email@hidden>
- Date: Sun, 24 Jul 2011 21:17:51 -0600
I'm using NSTask to run a background process, monitor its output, and ultimately present a message to the user. All has been fine with this 10.2 through 10.6, as far as I know. Now under 10.7 I saw a case where my code did not receive quite all the stdout output from the background process. I saw this once; I haven't tried running it a huge number of times, but it is definitely not the common case. (And I've never seen it in dev mode running under the debugger, only on a machine without dev tools. Also BTW, the output of the bg process is plain ASCII, no worries about multi-byte sequences.) Does anybody see anything wrong with this code (severely stripped for legibility):
- (void) doSomeTask: (NSTask *) task
{
NSTask * task = [[NSTask alloc] init];
[task setLaunchPath: cmdpath];
[task setArguments: [self getArgs]];
[task setStandardError: [NSPipe pipe]];
[task setStandardOutput: [NSPipe pipe]];
[task launch];
curScanTask = [task retain];
curStdOutStr = [[NSMutableString alloc] init];
curStdErrStr = [[NSMutableString alloc] init];
curStdOut = [[task standardOutput] fileHandleForReading];
curStdErr = [[task standardError] fileHandleForReading];
[[NSNotificationCenter defaultCenter]
addObserver: self selector: @selector( processStdOut: )
name: NSFileHandleReadCompletionNotification
object: curStdOut];
[[NSNotificationCenter defaultCenter]
addObserver: self selector: @selector( processStdErr: )
name: NSFileHandleReadCompletionNotification
object: curStdErr];
[curStdOut readInBackgroundAndNotify];
[curStdErr readInBackgroundAndNotify];
}
- (void) processStdOut: (NSNotification *) ntc
{
NSFileHandle *f = [ntc object];
NSData *d = [[ntc userInfo] objectForKey: NSFileHandleNotificationDataItem];
if( [d length] == 0 )
[self processPipeClose];
else
{
[f readInBackgroundAndNotify];
[curStdOutStr appendString:
[[[NSString alloc] initWithData: d encoding: NSASCIIStringEncoding] autorelease]];
}
}
- (void) processStdErr: (NSNotification *) ntc
{
NSFileHandle *f = [ntc object];
NSData *d = [[ntc userInfo] objectForKey: NSFileHandleNotificationDataItem];
if( [d length] == 0 )
[self processPipeClose];
else
{
[f readInBackgroundAndNotify];
[curStdErrStr appendString:
[[[NSString alloc] initWithData: d encoding: NSASCIIStringEncoding] autorelease]];
}
}
- (void) processPipeClose
{
[curStdOutStr appendString:
[[[NSString alloc] initWithData: [curStdOut readDataToEndOfFile] encoding: NSASCIIStringEncoding] autorelease]];
[[NSNotificationCenter defaultCenter]
removeObserver: self
name: NSFileHandleReadCompletionNotification
object: curStdOut];
curStdOut = nil;
[curStdErrStr appendString:
[[[NSString alloc] initWithData: [curStdErr readDataToEndOfFile] encoding: NSASCIIStringEncoding] autorelease]];
[[NSNotificationCenter defaultCenter]
removeObserver: self
name: NSFileHandleReadCompletionNotification
object: curStdErr];
curStdErr = nil;
}
--
Scott Ribe
email@hidden
http://www.elevated-dev.com/
(303) 722-0567 voice
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden