2012-06-15 25 views
8

Tamam, bu yüzden bir NSTask Objective-C ile komut satırı araçlarını çalıştırmak için yapabilirsiniz biliyorum: interaktif iletişim kurmak için bir yol varsa merak ediyorumKakao sarıcı

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

komut satırı araçları gdb gibi bir. Bu, kullanıcı etkileşimini temel alan (run, kill veya quit ve gdb gibi) komut girişlerini vermeyi ve daha sonra çıkış verdikleri bilgiye göre tepki vermeyi içerir.

cevap

2

Başlatılan programla iletişim kurmak için NSTask'in setStandardInput:, setStandardOutput: ve setStandardError: seçicilerini NSPipe örnekleri ile birlikte kullanabilirsiniz.

NSFileHandle *readFromMe = [[task standardOutput] fileHandleForReading]; 

bir boru kurmak için:

task = [[NSTask alloc] init]; 
[task setStandardOutput: [NSPipe pipe]]; 
[task setStandardError: [task standardOutput]]; // Get standard error output too 
[task setLaunchPath: @"/usr/bin/gdb"]; 
[task launch]; 

Daha sonra birlikte görevin çıkışını okumak için kullanabileceği bir NSFileHandle örneği elde edebilirsiniz: Örneğin

, görevin çıkışını okumak için gdb komutları göndermek için, eklemek istiyorum

[task setStandardInput: [NSPipe pipe]]; 

'dan önce görevi başlatırsınız. Sonra NSFileHandle

ile
NSFileHandle *writeToMe = [[task standardInput] fileHandleForWriting]; 
+0

Şerefe! NSData * data = [inString dataUsingEncoding: NSUTF8StringEncoding] gibi bir şey kullanır mıydınız? [writeToMe writeData: data]; 'övgüler göndermek için? Denedim ama işe yaramıyor. – bjz

+3

@bjz Bu işe yaramalı. Bir komut yazdıktan sonra kullanıcının isabet geri dönüşünü simüle etmek için dizenin sonuna bir '\ n 'eklemeyi unutmayın. – sjs

2

kullanın setStandardInput: ve NSTaks class ait setStandardOutput: yöntemlerini olsun.

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

Merhaba, bunu çalışmak için aldın mı? Bunu uygulamakta zorlanıyorum. Bildirimlerden hiçbirini alamıyorum. Bir git klonu gerçekleştirmek için bunu kullanıyorum. Kullanıcı adı ve şifre için bana sorulduğunda bana bildirmek için bildirimlere ihtiyacım var. Herhangi bir yardım? –