2013-01-19 56 views
0

作爲一個學習項目我正在爲Apache stresstesting命令行工具「ab」編寫一個簡單的gui。它需要一個完整的URL,包括一個像index.html或simular這樣的文件名作爲其參數之一。如果未指定文件名「ab」回顯「URL無效」並顯示可用標誌的列表。使用NSTask時的處理錯誤

我想抓住這個「錯誤」,並嘗試使用NSTasks standarderror輸出。無法真正實現它的工作。這是否會分類爲會導致標準錯誤的錯誤?

除了在啓動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]]; 
} 
+0

您可以調試並告訴我們,錯誤的確切位置。我認爲這是您設置發射路徑的時間點,但可以肯定。 – ipinak

+0

當我午餐NSTask時發生錯誤。可以在OSX終端中通過鍵入ab -c 1 -n 1 htp://www.example.com來重複該操作。 Ab在URL中請求一個文件名。我甚至不確定它會被歸類爲可以傳送的「錯誤」嗎? –

+0

你可以管它,但你需要從'main()' – ipinak

回答

1

ab寫入其錯誤消息,包括使用信息,標準錯誤。您目前只從標準輸出讀取。要訪問錯誤消息或使用信息,您需要分配第二個NSPipe,將它傳遞給-[NSTask setStandardError:],然後從中讀取數據。

+0

你是對的! AB確實寫入了standardError,這是我讀錯的方式。在上面的代碼中,添加另一個監聽-setStandardError的管道,並將「nil」而不是管道對象作爲參數「object:」放入通知中心。現在工作正常。謝謝! –