学習プロジェクトとして、Apacheストレステストコマンドラインツール「ab」の簡単なGUIを作成しています。パラメータの1つとして、index.htmlやsimularなどのファイル名を含む完全なURLが必要です。ファイル名が指定されていない場合、「ab」は「Invalid url」をエコーし、使用可能なフラグのリストを表示します。
この「エラー」をキャッチして、NSTasksの標準エラー出力を使用してみました。それを実際に機能させることはできません。これは、標準エラーにパイプされるエラーとしても分類されますか?
NSTaskを起動する前にURL入力を検証する以外に、このエラーを防ぐか、むしろキャッチできると思いますか?
私の簡単なコード:
- (void) stressTest:(NSString *)url withNumberOfRequests:(int)requests sendSimultaneously:(int)connections {
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *abPath = [[mainBundle bundlePath] stringByAppendingString:@"/Contents/Resources/ab"];
NSString* requestsStr = [NSString stringWithFormat:@"%i", requests];
NSString* connectionsStr = [NSString stringWithFormat:@"%i", connections];
// Init objects for tasks and pipe
NSTask *abCmd = [NSTask new];
NSPipe *outputPipe = [NSPipe pipe];
[abCmd setLaunchPath:abPath];
[abCmd setArguments:[NSArray arrayWithObjects:@"-n", requestsStr, @"-c", connectionsStr, url, nil]];
[abCmd setStandardOutput:outputPipe];
[abCmd launch];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readCompleted:) name:NSFileHandleReadToEndOfFileCompletionNotification object:[outputPipe fileHandleForReading]];
[[outputPipe fileHandleForReading] readToEndOfFileInBackgroundAndNotify];
}
- (void)readCompleted:(NSNotification *)notification {
NSString * tempString = [[NSString alloc] initWithData:[[notification userInfo] objectForKey:NSFileHandleNotificationDataItem] encoding:NSASCIIStringEncoding];
[resultTextOutlet setString:tempString];
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSFileHandleReadToEndOfFileCompletionNotification object:[notification object]];
}