Cocoa wrapper for an interactive Unix command
You can use NSTask's setStandardInput:
, setStandardOutput:
and setStandardError:
selectors in conjunction with NSPipe instances to communicate with the launched program.
For example, to read the task's output:
task = [[NSTask alloc] init];[task setStandardOutput: [NSPipe pipe]];[task setStandardError: [task standardOutput]]; // Get standard error output too[task setLaunchPath: @"/usr/bin/gdb"];[task launch];
You can then obtain an NSFileHandle
instance that you can use to read the task's output with:
NSFileHandle *readFromMe = [[task standardOutput] fileHandleForReading];
To set up a pipe for sending commands to gdb, you would add
[task setStandardInput: [NSPipe pipe]];
before you launch the task. Then you get the NSFileHandle
with
NSFileHandle *writeToMe = [[task standardInput] fileHandleForWriting];
Use setStandardInput:
and setStandardOutput:
methods of NSTaks class.
NSTask *task;task = [[NSTask alloc] init];[task setLaunchPath: @"/usr/bin/gdb"];NSPipe *outputpipe=[[NSPipe alloc]init];NSPipe *errorpipe=[[NSPipe alloc]init];NSFileHandle *output,*error;[task setArguments: arguments];[task setStandardOutput:outputpipe];[task setStandardError:errorpipe];NSLog(@"%@",arguments);output=[outputpipe fileHandleForReading]; error=[errorpipe fileHandleForReading]; [task launch]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedData:) name: NSFileHandleReadCompletionNotification object:output];[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedError:) name: NSFileHandleReadCompletionNotification object:error]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TaskCompletion:) name: NSTaskDidTerminateNotification object:task];//[input writeData:[NSMutableData initWithString:@"test"]];[output readInBackgroundAndNotify];[error readInBackgroundAndNotify];[task waitUntilExit];[outputpipe release];[errorpipe release];[task release];-(void) receivedData:(NSNotification*) rec_not { NSFileHandle *out=[[task standardOutput] fileHandleForReading]; NSData *dataOutput=[[rec_not userInfo] objectForKey:NSFileHandleNotificationDataItem]; if( !dataOutput) NSLog(@">>>>>>>>>>>>>>Empty Data"); NSString *strfromdata=[[NSString alloc] initWithData:dataOutput encoding:NSUTF8StringEncoding]; [out readInBackgroundAndNotify]; [strfromdata release];}/* Called when there is some data in the error pipe */-(void) receivedError:(NSNotification*) rec_not { NSFileHandle *err=[[task standardError] fileHandleForReading]; NSData *dataOutput=[[rec_not userInfo] objectForKey:NSFileHandleNotificationDataItem]; if( !dataOutput) NSLog(@">>>>>>>>>>>>>>Empty Data"); else { NSString *strfromdata=[[NSString alloc] initWithData:dataOutput encoding:NSUTF8StringEncoding]; [strfromdata release]; } [err readInBackgroundAndNotify];}/* Called when the task is complete */-(void) TaskCompletion :(NSNotification*) rec_not { NSLog(@"task ended");}