0

学習プロジェクトとして、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]];
}
4

1 に答える 1

2

ab使用法情報を含むエラーメッセージを標準エラーに書き込みます。現在、標準出力からのみ読み取っています。エラーメッセージまたは使用法情報にアクセスするには、1秒を割り当て、NSPipeそれをに渡してから-[NSTask setStandardError:]、そこからデータを読み取る必要があります。

于 2013-01-20T20:04:39.077 に答える