Cocoa wrapper for an interactive Unix command

前端 未结 2 1438
忘了有多久
忘了有多久 2020-12-17 22:21

Ok, so I know you can make an NSTask to run command line tools with Objective-C:

NSTask *task;
task = [[NSTask alloc] init];
[task setLaunchPath: @\"/usr/bin         


        
相关标签:
2条回答
  • 2020-12-17 22:54

    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");
    }
    
    0 讨论(0)
  • 2020-12-17 23:07

    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];
    
    0 讨论(0)
提交回复
热议问题