2011-07-22 22 views
9

私はこのcomamnd ps -ef | grep testを使用してNSTaskを実行しようとしていますが、 grepの試験はNSTaskに含まれる:シェルコマンドを実行する| (パイプ)NSTaskを使用して

これは私が、私は何とかプロセステストのPIDを取得する必要があります文字列にPS -efの出力を得るために、現在使用しているものです

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

NSArray *arguments; 
arguments = [NSArray arrayWithObjects: @"-ef", nil]; 
[task setArguments: arguments];  
NSPipe *pipe; 
pipe = [NSPipe pipe]; 
[task setStandardOutput: pipe]; 

NSFileHandle *file; 
file = [pipe fileHandleForReading]; 

[task launch]; 

NSData *data; 
data = [file readDataToEndOfFile]; 

NSString *string; 
string = [[NSString alloc] initWithData: data 
           encoding: NSUTF8StringEncoding]; 
NSLog (@"got\n%@", string); 
+0

代わりにあなたのプログラムでフィルタリングをしませんか? grepへのパイプ処理は遅くなります。 –

答えて

0

タスクを起動する前に[task waitUntilExit]を呼び出して、出力を読み込む前にプロセスが実行を終了できるようにする必要があります。

+0

プロセスが終了し、文字列にps -efの出力が表示されます。しかし、私はまた、その出力でgrepテストを行う必要があります。 – ed1t

15

パイプは、/bin/shのようなシェルによって提供される機能です。あなたは、このようなシェルを経由して、あなたのコマンドを起動してみてください可能性があります

/* ... */ 
[task setLaunchPath: @"/bin/sh"]; 
/* ... */ 
arguments = [NSArray arrayWithObjects: @"-c", @"ps -ef | grep test", nil]; 

をただし、ユーザーが値を指定せた場合(代わりにハードコーディングなどtest)、あなたがインジェクション攻撃をシェルに影響を受けやすいプログラムを作っていますSQLインジェクションのようなものです。この問題に悩まされない代替、grepの標準入力とpsの標準出力を接続するパイプオブジェクトを使用することです:

NSTask *psTask = [[NSTask alloc] init]; 
NSTask *grepTask = [[NSTask alloc] init]; 

[psTask setLaunchPath: @"/bin/ps"]; 
[grepTask setLaunchPath: @"/bin/grep"]; 

[psTask setArguments: [NSArray arrayWithObjects: @"-ef", nil]]; 
[grepTask setArguments: [NSArray arrayWithObjects: @"test", nil]]; 

/* ps ==> grep */ 
NSPipe *pipeBetween = [NSPipe pipe]; 
[psTask setStandardOutput: pipeBetween]; 
[grepTask setStandardInput: pipeBetween]; 

/* grep ==> me */ 
NSPipe *pipeToMe = [NSPipe pipe]; 
[grepTask setStandardOutput: pipeToMe]; 

NSFileHandle *grepOutput = [pipeToMe fileHandleForReading]; 

[psTask launch]; 
[grepTask launch]; 

NSData *data = [grepOutput readDataToEndOfFile]; 

/* etc. */ 

これが使用するビルトイン財団機能同じことを実行しますシェルが|文字に遭遇したときのシェルのステップ。

最後に他の人が指摘しているように、grepの使用法は過剰です。これをコードに追加してください:

NSArray *lines = [string componentsSeparatedByString:@"\n"]; 
NSArray *filteredLines = [lines filteredArrayUsingPredicate: [NSPredicate predicateWithFormat: @"SELF contains[c] 'test'"]]; 
+1

+1 "パイプはシェルによって提供される機能です..."私は何年もの理由を探していました! – Eonil

関連する問題