Cocoa wrapper for an interactive Unix command Cocoa wrapper for an interactive Unix command unix unix

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");}