好的,所以我知道你可以创建一个 NSTask 来使用 Objective-C 运行命令行工具:
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/gdb"];
[task launch];
我只是想知道是否有一种方法可以与交互式命令行工具(例如gdb
. 这将涉及根据用户交互(如或with )提供命令输入run
,然后根据其输出的信息做出反应。kill
quit
gdb
好的,所以我知道你可以创建一个 NSTask 来使用 Objective-C 运行命令行工具:
NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @"/usr/bin/gdb"];
[task launch];
我只是想知道是否有一种方法可以与交互式命令行工具(例如gdb
. 这将涉及根据用户交互(如或with )提供命令输入run
,然后根据其输出的信息做出反应。kill
quit
gdb
您可以将 NSTask 的setStandardInput:
,setStandardOutput:
和setStandardError:
选择器与 NSPipe 实例结合使用来与启动的程序进行通信。
例如,要读取任务的输出:
task = [[NSTask alloc] init];
[task setStandardOutput: [NSPipe pipe]];
[task setStandardError: [task standardOutput]]; // Get standard error output too
[task setLaunchPath: @"/usr/bin/gdb"];
[task launch];
然后,您可以获得一个NSFileHandle
可用于读取任务输出的实例:
NSFileHandle *readFromMe = [[task standardOutput] fileHandleForReading];
要设置用于向 gdb 发送命令的管道,您需要添加
[task setStandardInput: [NSPipe pipe]];
在您启动任务之前。然后你得到NSFileHandle
了
NSFileHandle *writeToMe = [[task standardInput] fileHandleForWriting];
NSTaks 类的使用setStandardInput:
和setStandardOutput:
方法。
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");
}